情况如下:
我在下面尝试过:
如果我忽略background
,我可以使用uploadTaskWithRequest:fromData:
,构建所有边界,内容处置和文件数据,然后上传到支持的服务器。我成功地做到了这一点。 BUT
我需要使用后台转移。
如果我在后台模式下强制使用此方法,则出现错误:Upload tasks from NSData are not supported in background sessions.
如果我使用后台模式,并使用uploadTaskWithRequest:fromFile:
,我会得到类似' stream ended unexpectedly
'从服务器来看,正如question提到的那样,最佳答案建议人们使用fromData
,这显然不是我的需要。
有没有办法实现这个目标?由于服务器无法改变它的支持,我需要后台传输和多部分/表单数据内容类型。
答案 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];
}];