gpt4 book ai didi

file-upload - 无法在 iOS 中使用 NSURLSession 多部分表单数据上传文件

转载 作者:行者123 更新时间:2023-12-03 20:28:33 27 4
gpt4 key购买 nike

我正在尝试使用 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;
上传视频/图像文件使用多部分表单数据的方法。但不知何故,我无法上传文件,我收到“stream ended unexpectedly”错误。

要求

  • 上传视频/图片文件到服务器
  • 应用应支持后台上传(应用进入后台后继续上传)
  • 服务器期望使用多部分表单数据发送数据。

  • 用于实现此目的的方法/API
  • NSURLSession 后台 session API(下面列出的完整代码)

    2. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL

  • 面临的挑战/问题
  • 每次我使用此 API 进行上传过程时都会遇到“stream ended unexpectedly”错误

  • 注意事项
  • 如果我使用 NSURLConnection,则使用相同的代码上传成功而不是 NSURLSession .
  • NSURLSession后台上传过程需要文件位置(NSURL)作为参数,不接受 NSData。它不允许我们将文件转换为 NSData在上传之前,即我们不能将 NSData 添加到文件正文中。

  • 在以下几点上需要帮助
  • 正在形成的多部分表单数据主体中是否有任何错误(注意 - 相同的代码正在使用 NSURLConnection)
  • 我的方法哪里出错了?
  • 我们是否需要在服务器级别进行任何更改以支持 NSURLSession backgroundSession上传? (在数据解析或其他方面?)

    这是用于上传文件的代码

  • NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
        // string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
    NSString* FileParamConstant = @"file";

    // the server url to which the image (or video) is uploaded. Use your server url here

    url=[NSURL URLWithString:[NSString stringWithFormat:@"%@%@%d",baseURL,@"posts/post/update/",createPostObject.PostID]];


    // create request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setHTTPShouldHandleCookies:NO];
    [request setTimeoutInterval:120];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];

    [request setURL:url];

    // set Content-Type in HTTP header
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"];

    if([[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"]){

    [request setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"] forHTTPHeaderField:AccessTokenKey];

    }

    // post body
    NSMutableData *body = [NSMutableData data];

    // add params (all params are strings)
    for (NSString *param in self.postParams) {

    NSLog(@"param is %@",param);

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [self.postParams objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }

    // add video file name to body

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"file.mp4\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: video/mp4\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    // [body appendData:self.dataToPost];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];



    // setting the body of the post to the request
    [request setHTTPBody:body];

    // set the content-length
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    NSLog(@"Request body %@", [[NSString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding]);

    NSURLSessionConfiguration * backgroundConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"backgroundtask1"];

    NSURLSession *backgroundSeesion = [NSURLSession sessionWithConfiguration: backgroundConfig delegate:self delegateQueue: [NSOperationQueue mainQueue]];


    NSURLSessionUploadTask *uploadTask = [backgroundSeesion uploadTaskWithRequest:request fromFile:self.videoUrl];
    [uploadTask resume];

    最佳答案

    为了防止浪费时间处理它。

    The complete snippet based on @dgatwood answer


    private func http(request: URLRequest){
    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: self, delegateQueue: .main)
    /*Tweaking*/
    let task = session.uploadTask(with: request, from: request.httpBody!)
    task.resume()
    }

    而且..不要忘记在请求对象上添加 header ,例如
    request.setValue("multipart/form-data; boundary=\(yourboundary)", forHTTPHeaderField: "Content-Type")

    关于file-upload - 无法在 iOS 中使用 NSURLSession 多部分表单数据上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36913436/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com