[英]Upload an image to a server folder (objective-c method to php script)
[英]Upload an Image Using Objective C to a PHP Server
我正在開發iphone應用程序並使用POST請求,我已經從同一主題閱讀了很多帖子,但是仍然無法正常工作,我將感謝您的幫助,這是我的代碼:
//turning the image into a NSData object
//getting the image back out of the UIImageView
//setting the quality to 72
NSData *image_data = UIImageJPEGRepresentation(picture, 72);
// setting up the URL to post to
NSMutableString *urlString = [[NSMutableString alloc] init];
[urlString appendString:BASE_URL];
[urlString appendString:@"mobile_services/mobile_store_services/upload_wishlist_image/"];
//[urlString appendString:@"/temp_trash/temporal.php"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
// file
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:image_data];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
// Text parameter1
NSString *param1 = @"parameter text";
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"texto_prueba\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
// close form
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// set request body
[request setHTTPBody:body];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(conn){
web_data = [NSMutableData data];
}else{
NSLog(@"doesn't exist");
}
我正在使用NSURLConnectionDataDelegate協議,因此,我通過以下方法接收了數據:
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
//NSArray *json_data = [NSJSONSerialization JSONObjectWithData:web_data options:kNilOptions error:NULL];
NSString *returningString = [[NSString alloc] initWithData:web_data encoding:NSUTF8StringEncoding];
NSLog(@"returned string = %@", returningString);
[loadingView stopLoading];
}
我的PHP方面,只告訴我,它以這種方式收到了什么:
public function upload_wishlist_image()
{
var_dump($_REQUEST);
}
請幫忙!,PHP沒有收到任何圖像數據。
看來您已經放棄了該技術,並轉換為64基。我不怪您,因為手動創建這些請求很麻煩。 將來,如果您使用AFNetworking發出請求,生活將會變得更加輕松。
無論如何,如果您對為什么代碼無法正常工作感興趣,那么第一個問題就是NSMutableURLRequest
。 盡管有以下幾點觀察,但它非常非常接近:
您應該使用文件的mime類型(在這種情況下為image/jpeg
),並且僅在不知道文件的mime類型時才使用application/octet-stream
。 因此,您應該消除該application/octet-stream
。
除了二進制數據的最后一行,您應該在每行的末尾使用\\r\\n
。
因此,代替:
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
你應該有:
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; filename=\"test.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
其次,修復請求后,PHP $_REQUEST
變量應僅由'texto_prueba' => 'parameter text'
。 如果您沒有看到,那么我會問您如何進行從URL到PHP函數的映射。
但是,就您上傳的圖像而言,您不會在$_REQUEST
找到該圖像。 userfile
參數將由$_FILES
返回,而不是由$_REQUEST
。
另一個最終發現:您正在通過UIImageJPEGRepresentation
將圖像轉換回NSData
。 如果可以(通過dataWithContentsOfFile
)獲取NSData
,可能比通過UIImage
其往返並返回NSData
更好,這將導致圖像質量下降和元數據丟失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.