【问题标题】:iPhone upload multipart file using AFNetworkingiPhone 使用 AFNetworking 上传多部分文件
【发布时间】:2013-03-02 21:15:22
【问题描述】:

在我的 iOS 应用程序中,我想使用 NSMutableURLRequest 为多部分文件上传带有 java API 的文件。这是显示参数的表格。

  <form action="API_URL" encType='multipart/form-data' method=post>
            <input type=file name="files">
            <input type=submit value="Upload Attempt Files">

编辑表格2

       <form action='URL' method="post" encType='multipart/form-data'>
<input name="key1" value='123'>
<input name="key2" value='asdf'>
<input name="key3" value='qwerty'>
<input name="key4" value='aaa'>
<input name="key5" value='aaa'>
<input name="key6" value='false'>
<input type="file"  name="files">
<input type=submit value="Create Forum Posts">
   </form>        

我怎样才能做到这一点?

这个Question 展示了如何在iOS 中使用AFNetworking 上传分段文件(目标c)。但我不知道如何按照我使用的形式放置参数。

【问题讨论】:

  • 我是否正确地假设您想通过 Objective-C 中的 AFNetworking 进行此上传? (对“Java API”的引用令人困惑,但我现在假设您只是说您正在服务器上运行一些 Java。对吗?)
  • 好的。 iOS 应用程序并不真正关心服务器在幕后使用什么技术,因为它通过 HTTP 进行通信,而这正是我们在这里真正关心的。您问题中的“java”标签和引用可能会使读者误入歧途。您可能想删除这些引用...
  • 后续问题:您的 HTML 有显示“上传尝试文件”的按钮,您的 file 输入字段称为 files(复数),但我假设您只上传一个文件一次。我的回答如下,假设您正在发送一个文件,但如果您的问题(为简洁起见)从上面的 HTML sn-p 中省略了某些内容,否则将允许指定多个文件,让我知道。

标签: ios objective-c api file-upload


【解决方案1】:

查看您的 HTML,您的 &lt;input type=file&gt;namefiles,因此,您将使用 @"files" 作为 name 参数到 appendPartWithFileData 方法。例如,AFNetworking 3.x:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileData:imageData
                                name:@"files"
                            fileName:photoName mimeType:@"image/jpeg"];

    [formData appendPartWithFormData:[key1 dataUsingEncoding:NSUTF8StringEncoding]
                                name:@"key1"];

    [formData appendPartWithFormData:[key2 dataUsingEncoding:NSUTF8StringEncoding]
                                name:@"key2"];

    // etc.
} progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"Response: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"Error: %@", error);
}];

(对于 AFNetworking 1.x 和 2.x 语法,请参阅此答案的修订历史。)

【讨论】:

  • 感谢您的帮助....这里如何发送 cookie 数据以进行身份​​验证.. 还有一件事我发送的请求在服务器上不可见,这可能是错误的...
  • @ios 不确定是否是 cookie,但也许 this answer 有帮助。至于为什么它不起作用,我不能说,因为我在我的服务器上对其进行了测试,并且文件显示正常。但是,如果您需要 cookie 数据以进行身份​​验证并且尚未这样做,您会期望它起作用吗?无论如何,也许编辑您的问题,添加您上传代码的最新版本。
  • @ios 我假设您只需在该 multipartFormRequestWithMethod 块中添加对 appendPartWithFormData:name 的调用。
  • 我也试过 NSMutableData *val4key1 =[[NSMutableData alloc] init]; [val4key1 appendData:[[NSString stringWithFormat:@"%@",mystring] dataUsingEncoding:NSUTF8StringEncoding]; [formData appendPartWithFormData:val4key1 name:@"key1"];但它向我显示错误无效参数不令人满意:body'可能有什么问题
  • @ios 是的,从概念上讲,尽管您可以简化为 [formData appendPartWithFormData:[mystring dataUsingEncoding:NSUTF8StringEncoding] name:@"key1"]; 请参阅修订后的答案。我已经测试了上面的代码,它似乎至少可以与我的服务器一起使用。您在哪里看到该错误?
【解决方案2】:
-(void) makePhotoUploadRequest{

    NSArray *keys = [[NSArray alloc]initWithObjects:@"UserID", @"CompanyName" ,@"Location",@"Latitude",@"Longitude",@"Tagline",@"Goals",@"ColorName",nil];
    NSArray *values =[[NSArray alloc]initWithObjects:@"103",@"queppelin",@"Jaiur",@"11.3" ,@"12.3",@"Let's do it",@"Let's do it",@"Let's do it", nil];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    NSURL *baseUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/%@/RegisterCompanyUser",serverRequest,serverPort,serverName]];

    NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    [request setURL:baseUrl];
    [request setHTTPMethod:@"POST"];

   NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *endBoundary = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary];

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=%@; boundary=%@", charset, boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *tempPostData = [NSMutableData data];
    [tempPostData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];


           for(int i=0;i<keys.count;i++){
               NSString *str = values[i];
               NSString *key =keys[i];
               NSLog(@"Key Value pair: %@-%@",key,str);
               [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
               [tempPostData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
              // [tempPostData appendData:[@"\r\n--%@\r\n",boundary dataUsingEncoding:NSUTF8StringEncoding]];
                   [tempPostData appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]];

        }





    // Sample file to send as data
    [tempPostData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Image\"; filename=\"%@\"\r\n", @"company-logo.png"] dataUsingEncoding:NSUTF8StringEncoding]];
    [tempPostData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

    UIImage *myImageObj = [UIImage imageNamed:@"company-logo.png"];
    NSData *mydata= UIImagePNGRepresentation(myImageObj);
    NSLog(@"Image data:%d",mydata.length);
        [tempPostData appendData:mydata];

    [tempPostData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:tempPostData];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if( theConnection )
    {
       dataWebService = [NSMutableData data] ;
        NSLog(@"request uploading successful");
    }
    else
    {
        NSLog(@"theConnection is NULL");
    }


}

【讨论】:

    【解决方案3】:

    您可以使用以下代码在使用 afnetworking 3.x 的多部分请求中发送图像和 n 个参数

     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
     //manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // uncomment this line when the server is not returning JSON
    
    [manager POST: urlString parameters: nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileData:imageData
                                    name:@"file"
                                fileName:imageName mimeType:@"image/jpeg"];
            for (NSString *key in parameters) {
                [formData appendPartWithFormData:[[[parameters objectForKey:key] description] dataUsingEncoding:NSUTF8StringEncoding] name:key];
            }
    
        // etc.
    } progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"Response: %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多