将图像从 iOS 上传到 PHP
Posted
技术标签:
【中文标题】将图像从 iOS 上传到 PHP【英文标题】:Upload image from iOS to PHP 【发布时间】:2014-05-15 00:13:06 【问题描述】:我正在尝试通过 php 将图像从我的 ios 应用程序上传到我的网络服务器。下面是代码:
-(void)uploadImage
NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
//1
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//2
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSString *urlString = @"http://mywebserver.com/script.php";
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=\"userfile\"; filename=\"iosfile.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];
//3
self.uploadTask = [defaultSession uploadTaskWithRequest:request fromData:imageData];
//4
self.progressBarView.hidden = NO;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
//5
[uploadTask resume];
// update the progressbar
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
dispatch_async(dispatch_get_main_queue(), ^
[self.progressBarView setProgress:(double)totalBytesSent / (double)totalBytesExpectedToSend animated:YES];
);
// when finished upload
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
dispatch_async(dispatch_get_main_queue(), ^
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
self.progressBarView.hidden = YES;
[self.progressBarView setProgress:0.0];
);
if (!error)
// no error
NSLog(@"no error");
else
NSLog(@"error");
// error
以及以下工作简单的 PHP 代码:
<?php
$msg = " ".var_dump($_FILES)." ";
$new_image_name = $_FILES["userfile"]["name"];
move_uploaded_file($_FILES["userfile"]["tmp_name"], getcwd() . "/pictures/" . $new_image_name);
?>
iOS 上的应用程序似乎上传了照片,进度条正在工作,但是当我检查服务器文件时,文件并没有真正上传。
当我使用以下代码发送图片时,它可以完美运行(编辑:但没有进度条):
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
知道我哪里错了吗?
【问题讨论】:
有什么理由不使用有效的代码? @68cherries 它是同步的,不是一个好主意。但是sendAsynchronousRequest:queue:completionHandler:
是同步方法的一个很好且简单的替代方法。
@68cherries 我想显示一个进度条,据我了解,唯一的方法是使用 iOS7 NSURLSessionUploadTask
或connectionWithRequest:delegate:
。
如果进度条正在加载并且您没有收到任何错误,那么我猜服务器端代码有问题。不幸的是我对php一无所知。
【参考方案1】:
最后我使用了AFNetworking
库来处理这个问题。由于我还没有在 web 和 *** 上找到明确的方法来执行此操作,因此我的答案是通过 PHP 轻松地将用户的图像从他们的 iOS 设备发布到您的服务器。大部分代码来自this *** post。
-(void)uploadImage
image = [self scaleImage:image toSize:CGSizeMake(800, 800)];
NSData *imageData = UIImageJPEGRepresentation(image, 0.7);
// 1. Create `AFHTTPRequestSerializer` which will create your request.
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
NSDictionary *parameters = @@"your_param": @"param_value";
NSError *__autoreleasing* error;
// 2. Create an `NSMutableURLRequest`.
NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://www.yoururl.com/script.php" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileData:imageData
name:@"userfile"
fileName:@"image.jpg"
mimeType:@"image/jpg"];
error:(NSError *__autoreleasing *)error];
// 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created.
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Failure %@", error.description);
];
// 4. Set the progress block of the operation.
[operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten,
long long totalBytesWritten,
long long totalBytesExpectedToWrite)
//NSLog(@"Wrote %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite);
[self.progressBarView setProgress:(double)totalBytesWritten / (double)totalBytesExpectedToWrite animated:YES];
];
// 5. Begin!
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
self.progressView.hidden = NO;
[operation start];
我认为这将有助于新的 xcoders。
干杯。
【讨论】:
你有没有发现如何使用 NSURLSession 做到这一点?我现在正在处理它,但遇到了麻烦。 这是我的帖子,尽管有些 SO'ers 太快将其标记为重复! ***.com/questions/25098056/… @marciokoko 无法弄清楚如何使用NSURLSession
,但使用AFNetworking
可以正常工作。如果您这样做,您将获得更简洁的代码,并且您将能够更轻松地处理网络错误。以上是关于将图像从 iOS 上传到 PHP的主要内容,如果未能解决你的问题,请参考以下文章
iOS 到 php 服务器文件上传 - 我应该允许啥文件大小的图像?