将图像从 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 服务器文件上传 - 我应该允许啥文件大小的图像?

如何使用 asynctask 将图像从 android 上传到 php

将图像从 android 上传到 PHP 服务器

将图像从 localStorage 上传到 PHP

将图像从android上传到服务器php时出错?

如何使用传入的图像 URL 将图像从 iOS 上传到 DropBox?