通过POST和NSURLSession上传图片NSData

我试图上传一个单一的UIImage到服务器,一切似乎是好的,除了图像从未上传。

这是我用来在iOS上载图片的代码:

const NSString *boundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy"; const NSString *fileParamConstant = @"photo"; NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundaryConstant]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; NSMutableData *body = [NSMutableData data]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library assetForURL:info[UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) { ALAssetRepresentation *representation = [asset defaultRepresentation]; // get byte size of image long long size = [representation size]; unsigned char *bytes = malloc(size); // read image data into bytes array [representation getBytes:bytes fromOffset:0 length:size error:nil]; NSData *imageData = [NSData dataWithBytesNoCopy:bytes length:size freeWhenDone:YES]; if (imageData) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fileParamConstant, filename] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",[SWNetworkController contentTypeForImageData:imageData]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; NSString *postLength = [NSString stringWithFormat:@"%zu", [body length]]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:body]; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"STRING %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); NSLog(@"%@", response); NSLog(@"%@", error); }]; [uploadTask resume]; } failureBlock:^(NSError *error) { NSLog(@"Image error:\n%@",error); }]; 

服务器响应200 OK状态,没有错误,除非图像没有收到,并且没有任何东西从服务器返回(如果没有图像上传,这是预期的)。

这里是服务器端的代码:

 <? $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $_FILES["photo"]["name"]); $extension = end($temp); error_log(print_r($_FILES, true)); if ((($_FILES["photo"]["type"] == "image/gif") || ($_FILES["photo"]["type"] == "image/jpeg") || ($_FILES["photo"]["type"] == "image/jpg") || ($_FILES["photo"]["type"] == "image/pjpeg") || ($_FILES["photo"]["type"] == "image/x-png") || ($_FILES["photo"]["type"] == "image/png")) && ($_FILES["photo"]["size"] < 20000000) && in_array($extension, $allowedExts)) { if ($_FILES["photo"]["error"] == 0) { $filename = sha1($_FILES['photo']['name'] . uniqid("",true)); if (move_uploaded_file($_FILES['photo']['tmp_name'], 'pic/' . $filename . "." . $extension)) { // do stuff with the saved image here } } } ?> 

正常的请求(通过Web界面)logging下列内容:

 Array ( [photo] => Array ( [name] => BoPzSyRIgAAe1h6.jpg-large.jpeg [type] => image/jpeg [tmp_name] => /var/tmp/phpjScXQB [error] => 0 [size] => 67900 ) ) 

同时,从iOS发送的请求如下所示:

 Array ( ) 

对于我的生活,我无法弄清楚什么是错的…任何想法?

谢谢

问题出在NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:...]

NSURLSessionUploadTask忽略提供的请求主体,并添加fromData:参数作为请求主体。 但是,我只是提供图像数据,而不是格式正确的请求主体…

固定的代码是NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:body completionHandler:...]

我会留下我的回答,以防其他人再次绊倒这个问题。