Objective c 上载文件在后台使用uploadTaskWithRequest:fromFile:并使用多部分/表单数据
情况如下:Objective c 上载文件在后台使用uploadTaskWithRequest:fromFile:并使用多部分/表单数据,objective-c,multipartform-data,background-task,Objective C,Multipartform Data,Background Task,情况如下: 我的服务器只接受多部分/表单数据上传操作 我的应用程序需要实现后台上传 我试过以下方法: 如果忽略background,我可以使用uploadTaskWithRequest:fromData:,生成所有边界、内容处置和文件数据,然后上载到支持的服务器。我确实成功地做到了这一点但是我需要使用后台传输 如果在后台模式下强制使用此方法,则会出现错误:后台会话不支持从NSData上载任务。 如果我使用后台模式,并使用uploadTaskWithRequest:fromFile:,我从服务器上
background
,我可以使用uploadTaskWithRequest:fromData:
,生成所有边界、内容处置和文件数据,然后上载到支持的服务器。我确实成功地做到了这一点<代码>但是我需要使用后台传输后台会话不支持从NSData上载任务。
uploadTaskWithRequest:fromFile:
,我从服务器上得到了类似于“流意外结束”
”的东西,正如上面提到的,最好的答案是建议人们使用fromData
,这显然不是我需要的那么有什么办法可以做到这一点呢?由于服务器无法更改其支持,我需要后台传输和多部分/表单数据内容类型。最后,我发现这是一个NSURLSERSESSION错误,由此,我找到了一种使用
fromFile
方法成功上传文件的方法(很多答案已经用过了,但AFNetworking的文档中仍然没有显示
您只需将文件写入临时文件,并使用AF的方便方法构建多部分
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];
}];
NSMutableURLRequest*multipartRequest=[[AFHTTPRequestSerializer序列化程序]
multipartFormRequestWithMethod:@“POST”
url字符串:[url绝对字符串]
参数:零
constructingBodyWithBlock:^(id_非空formData){
[formData appendPartWithFileURL:[NSURL URLWithString:filename]
名称:@“文件”
文件名:短名称
mimeType:@“应用程序/八位字节流”
错误:无];
}错误:无];
[[AFHTTPRequestSerializer]requestWithMultipartFormRequest:MultipartRequestWritingStreamContentStoFile:[NSURL URLWithString:temp\u file\u name]completionHandler:^(NSError*\u可为空错误){
NSURLSessionUploadTask*task=[bgsession uploadTaskWithRequest:multipartRequest
fromFile:[NSURL URLWithString:temp_文件名]
completionHandler:^(NSData*\u可为空的数据,NSURLResponse*\u可为空的响应,NSError*\u可为空的错误){
[[NSFileManager defaultManager]removiteMatPath:temp_file_name错误:nil];
NSLog(@“==========响应=====\n%@),[[NSString alloc]initWithData:数据编码:NSUTF8STRINGENCONDING]);
}];
[任务恢复];
}];
第三点可能表明表单数据中存在语法错误。您是否尝试使用命令行工具(如curl
或nc
)上载此数据?@macmoonshine问题是,我使用fromData
方法成功上载了我的文件,该方法通过代码生成所有多部分数据。并使用fromFile
方法,您不需要生成数据,那么为什么我要测试这个数据
,或者我如何测试数据
。我记录了请求,fromFile
方法甚至没有发送任何正文数据、正文流和内容长度,那么,为什么这个方法存在……或者应该通过代码构建一些其他东西?文档在哪里或者演示?…文件应该包含您的表单数据,您应该使用curl
测试此文件。很抱歉造成混淆。@macmoonshine谢谢,但这似乎是NSURLSession的错误,我通过使用AF方便的方法将上载文件写入临时文件来解决此问题。我们还需要在appdelegate handleEventsForBackgroundURLSession中编写代码以完成finish此请求,对吗?@iChirag这是背景问题,而不是上载错误。您仍然可以自己完成此功能所需的所有操作。@walker,我尝试使用您的解决方案,但在将StreamContentStoFile写入文件时出错。您能与我共享文件上载的完整代码吗?