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 benutzePunkte zu beachten
Der Upload wird mit demselben Code erfolgreich, wenn ich @ verwendNSURLConnection
Anstatt vonNSURLSession
.
NSURLSession
eim 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];