Hochladen von Dateien mit mehrteiligen NSURLSession-Formulardaten in iOS nicht möglich

Ich versuche, eine Video- / Bilddatei mit @ hochzulade- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; -Methode mit mehrteiligen Formulardaten. Aber irgendwie kann ich die Datei nicht hochladen und bekomme "stream ended unexpectedly" Error

Bedar

Lade eine Video- / Bilddatei auf den Server hochApp sollte Hintergrund-Uploads unterstützen (Upload-Vorgang fortsetzen, auch wenn die App in den Hintergrund wechselt)Server erwartet, dass die Daten mit mehrteiligen Formulardaten gesendet werden.

Methoden / APIs, die verwendet werden, um dies zu erreichen

NSURLSession-Hintergrundsitzungs-API (vollständiger Code unten aufgeführt)

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

Herausforderungen / Probleme

facing "stream ended unexpectedly "Fehler jedes Mal, wenn ich diese API für den Upload-Vorgang benutze

Punkte zu beachten

Der Upload wird mit demselben Code erfolgreich, wenn ich @ verwendNSURLConnection Anstatt vonNSURLSession.

NSURLSessioneim Hochladen im Hintergrund wird der Speicherort der Datei erwartet NSURL) als Parameter akzeptiert keine NSData. Es erlaubt uns nicht, die Datei nach @ zu konvertierNSData vor dem Hochladen, d. h. wir können NSData nicht zum Dateikörper hinzufügen.

Benötigen Sie Hilfe zu folgenden Punkten

Liegt ein Fehler im mehrteiligen Formulardatentext vor, der gerade erstellt wird (Hinweis: Derselbe Code funktioniert mit NSURLConnection)

Wo gehe ich falsch an?

Müssen wir Änderungen auf Serverebene vornehmen, um @ zu unterstützeNSURLSession backgroundSession Uploads? (Beim Parsen von Daten oder etwas anderem?)

Hier ist der Code, der zum Hochladen einer Datei verwendet wird

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];

Antworten auf die Frage(4)

Ihre Antwort auf die Frage