上传文件使用uploadTaskWithRequest:fromFile:在后台并使用multipart / form-data

时间:2016-12-12 14:29:39

标签: objective-c multipartform-data background-task

情况如下:

  1. 我的服务器只接受 multipart / form-data 上传操作。
  2. 我的应用需要实施后台上传
  3. 我在下面尝试过:

    1. 如果我忽略background,我可以使用uploadTaskWithRequest:fromData:,构建所有边界,内容处置和文件数据,然后上传到支持的服务器。我成功地做到了这一点。 BUT我需要使用后台转移。

    2. 如果我在后台模式下强制使用此方法,则出现错误:Upload tasks from NSData are not supported in background sessions.

    3. 如果我使用后台模式,并使用uploadTaskWithRequest:fromFile:,我会得到类似' stream ended unexpectedly'从服务器来看,正如question提到的那样,最佳答案建议人们使用fromData,这显然不是我的需要。

    4. 有没有办法实现这个目标?由于服务器无法改变它的支持,我需要后台传输和多部分/表单数据内容类型。

1 个答案:

答案 0 :(得分:2)

最后,我发现它是一个NSURLSession错误,从issue开始,我找到了一种成功上传fromFile方法文件的方法(并且已经使用了许多SO答案,但是& #39;仍未在AFNetworking的文档中显示。

您只需要将文件写入临时文件,并使用AF方便的方法构建multipart部分。你可以找到自己的后端原因,这是我的代码

    NSMutableURLRequest *multipartRequest = [[AFHTTPRequestSerializer serializer]
                                     multipartFormRequestWithMethod:@"POST"
                                     URLString:[url absoluteString]
                                     parameters:nil
                                     constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
                                         [formData appendPartWithFileURL:[NSURL URLWithString:filename]
                                                                    name:@"file"
                                                                fileName:short_name
                                                                mimeType:@"application/octet-stream"
                                                                   error:nil];
                                     } error:nil];

[[AFHTTPRequestSerializer serializer] requestWithMultipartFormRequest:multipartRequest writingStreamContentsToFile:[NSURL URLWithString:temp_file_name] completionHandler:^(NSError * _Nullable error) {
NSURLSessionUploadTask *task = [bgsession uploadTaskWithRequest:multipartRequest
                                                       fromFile:[NSURL URLWithString:temp_file_name]
                                              completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                                                  [[NSFileManager defaultManager] removeItemAtPath:temp_file_name error:nil];
                                                  NSLog(@"=========response=========\n%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                                              }];
[task resume];
}];