2012-10-19 184 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"; 
      }]; 
容易
相關問題