objective-c - 上传文件使用uploadTaskWithRequest :fromFile: in background and use multipart/form-data

标签 objective-c multipartform-data background-task

情况如下:

  1. 我的服务器仅接受multipart/form-data上传操作。
  2. 我的应用需要实现后台上传

我尝试过以下方法:

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

  2. 如果我在后台模式下强制使用此方法,则会收到错误:后台 session 不支持从 NSData 上传任务。

  3. 如果我使用后台模式,并使用 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/

相关文章:

iOS:从 viewDidAppear 更改 View

iphone - 写入文件而不覆盖 ObjC

node.js - 无法在Azure Function上的Node JS中接收和解析多部分以及文本数据

c# - 在 Windows Phone 8.1 上运行频繁的后台任务

ios - Xcode 6.3 上架构 x86_64 的 undefined symbol

ios - iOS 6.1 状态栏字体变化

c# - ReadAsMultipartAsync 实际上是如何工作的?

java - 使用改造将压缩图像上传到服务器

c# - 当应用程序在 UWP 中更新时运行一些代码

c# - Windows Phone 8.1 从应用程序执行后台任务(定时器触发)