如何与服务器连接以从我的应用程序上传文件(图片)

时间:2013-06-06 13:13:06

标签: ios objective-c file-upload afnetworking

所以我尝试使用名为UploadFile的Web服务将文件(图片)上传到服务器,该服务需要2个变量。

FileInfo infoint requestId(在我的情况下总是0) FileInfo对象包含多个变量name(字符串),description(字符串),content(文件的二进制数据,在这种情况下,它将是图像), id(字符串)和name(字符串)

如何与此服务器连接以使请求通过?通常当我一直在拉/发信息时我刚刚做JSON调用,但我猜测上传是不同的。当服务需要传递自定义对象时,我不确定如何执行此操作。

我是否需要在App中创建对象?

我正在尝试使用AFNetworking的AFHTTPRequestOperations

我正在尝试将他们的示例用作跳板,但我仍然需要确保他们的上传示例中要更改的内容,因为该示例使用直接上传图像,我需要上传FileInfo对象而不是jpeg

               NSURL *url = [NSURL URLWithString:@"https://SomeDomain.com/Services/FileService.svc/UploadFile"];
                AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
                NSData *imageData = UIImageJPEGRepresentation([self.photoImageView image], 0.5);

                NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {

                    [formData appendPartWithFileData:imageData name:@"avatar" fileName:@"Upload.jpg" mimeType:@"image/jpg"];

                }];

                NSLog(@"Request %@", [request description]);

                AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
                NSLog(@"Operation: %@", [operation description]);
                [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
                    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
                }];
                [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
                    NSLog(@"RESPONSE: %@", [responseObject description]);
                } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                    NSLog(@"Failed: %@", [error description]);
                }];
                [httpClient enqueueHTTPRequestOperation:operation];

谢谢, 艾伦

2 个答案:

答案 0 :(得分:0)

如果您看到了methode multipartFormRequestWithMethod的AFNetworking文档...您有一个Dictionnary参数,您可以在其中插入Web服务所需的所有信息。

  

/ **使用指定的HTTP创建NSMutableURLRequest对象   方法和路径,并构造一个multipart/form-data HTTP正文,   使用指定的参数和多部分表单数据块。看到   http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2

     

自动流式传输多部分表单请求,读取文件   直接来自磁盘以及单个HTTP正文中的内存数据。   生成的NSMutableURLRequest对象具有HTTPBodyStream   属性,所以不要设置HTTPBodyStreamHTTPBody   这个请求对象,因为它将清除多部分表单主体   流。 @param方法请求的HTTP方法。这个   参数不得为GETHEADnil。 @param path路径   要附加到HTTP客户端的基本URL并用作请求   URL。 @param参数要编码和设置的参数   请求HTTP正文。 @param block一个接受单个参数的块   并将数据附加到HTTP正文。 block参数是一个对象   采用AFMultipartFormData协议。这可以用来   上传文件,将HTTP主体编码为JSON或XML,或指定多个   相同参数的值,可以是数组值的值。

     

@return NSMutableURLRequest对象* /

答案 1 :(得分:0)

参考这个。他们给出了不同的方法: https://github.com/AFNetworking/AFNetworking