2012-10-19 149 views
0

我一直在尝试如何将图像上传到API。这里有一个cURL例子。iOS照片上传到服务器

curl "http://address.com/api/" -F "parameter[name]=My Upload" -F "parameter[description]=this is my upload" -F "parameter[other]=additional info" -F "parameter[image][email protected]_2560x1600.jpg;type=image/jpg" 

我将如何使用这个通过NSMutableURLRequest & NSURLConnection的上传到服务器?我尝试了几种不同的方式,但没有成功。有人有主意吗?

编辑:

目前,我正在尝试ASIFormDataRequest

做的
NSData *imageData = UIImageJPEGRepresentation(image, 0.9); 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setDelegate:self]; 
[request addRequestHeader:@"User-Agent" value:@"iOS App"]; 
[request addPostValue:@"name" forKey:@"parameter[name]"]; 
[request addPostValue:@"description" forKey:@"parameter[description]"]; 
[request addPostValue:@"other" forKey:@"parameter[other]"]; 
[request addData:imageData withFileName:[NSString stringWithFormat:@"jpeg_%d.jpg", rand()] andContentType:@"image/jpeg" forKey:@"param[image]"]; 
[request startAsynchronous]; 

回答

2

粗糙的方式。

PHP脚本。

<?php 
$target_path = "./"; 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
echo "The file ". basename($_FILES['uploadedfile']['name']). 
" has been uploaded"; 
} else{ 
echo "There was an error uploading the file, please try again!"; 
} 
?> 

IOS代码

- (void)upload:(UIImage *)image { 
    NSData *imageData = UIImageJPEGRepresentation(image, 80); 
    NSString *urlString = @"http://www.upload.com/upload.php"; // URL of upload script. 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

    NSMutableData *body = [NSMutableData data]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"test.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[NSData dataWithData:imageData]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:body]; 

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
    NSLog(@"returnString: %@", returnString); 
} 

只要确保你使用的变量名是一样的,在这里我用 “UploadedFile的” 既为PHP和ioscode

PHP

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 

ios

[body appendData:[@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"test.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

//虽然现在即时通讯使用https://github.com/samvermette/SVHTTPRequest

如果导入库在你的代码,然后进行上传会为这个

[SVHTTPRequest POST:@"http://www.upload.com/upload.php" 
      parameters:[NSDictionary dictionaryWithObjectsAndKeys:imageData, @"uploadedfile", nil] 
       progress:^(float progress) { 
        progressLabel.text = [NSString stringWithFormat:@"Uploading (%.0f%%)", progress*100]; 
       } 
      completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) { 
       progressLabel.text = @"Upload complete"; 
      }]; 
容易
相关问题