Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 上载文件在后台使用uploadTaskWithRequest:fromFile:并使用多部分/表单数据_Objective C_Multipartform Data_Background Task - Fatal编程技术网

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写入文件时出错。您能与我共享文件上载的完整代码吗?