情况如下:
- 我的服务器仅接受multipart/form-data上传操作。
- 我的应用需要实现后台上传。
我尝试过以下方法:
如果我忽略
background
,我可以使用uploadTaskWithRequest:fromData:
,构建所有边界、内容处置和文件数据,然后上传到支持的服务器。我确实成功地做到了这一点。但是
我需要使用后台传输。如果我在后台模式下强制使用此方法,则会收到错误:
后台 session 不支持从 NSData 上传任务。
如果我使用后台模式,并使用
uploadTaskWithRequest:fromFile:
,我会从服务器收到类似“流意外结束
”的信息,如 question 提到的,最好的答案建议人们使用fromData
这显然不是我的需要。
那么有什么办法可以实现这一点吗?由于服务器无法更改其支持,因此我需要后台传输和多部分/表单数据内容类型。
最佳答案
最后,我从这个 issue 中发现这是一个 NSURLSession bug。 ,我找到了一种使用 fromFile
方法成功上传文件的方法(许多 SO 答案已经使用了该方法,但它仍然没有显示在 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];
}];
关于objective-c - 上传文件使用uploadTaskWithRequest :fromFile: in background and use multipart/form-data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103104/