Frage NSURLSessionUploadTask konnte die Datei nicht hochladen


Unten ist ein Ausschnitt für das Hochladen einer Bilddatei. Ich möchte nur NSURLSessionUploadTask verwenden, da es eine Hintergrund-Upload-Funktion gibt, die ich in meiner App verwenden möchte.

Auch ich möchte POST-Parameter zusammen mit dem Datei-Upload.

Auch ich bin nicht gut in server side code.Kann jemand bitte führen Sie mich, was mache ich falsch.

Code hochladen

NSString* filePath = [[NSBundle mainBundle]
                      pathForResource:@"sample" ofType:@"jpg"];
uint64_t bytesTotalForThisFile = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileSize];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadPath];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%llu", bytesTotalForThisFile] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];

[request setTimeoutInterval:30];

NSString* filePath = [[NSBundle mainBundle]
                      pathForResource:@"sample" ofType:@"jpg"];


NSURLSessionUploadTask *taskUpload= [self.uploadSession uploadTaskWithRequest:request fromFile:[[NSURL alloc] initFileURLWithPath:filePath]];

PHP-Code

<?php

$objFile = & $_FILES["file"];
$strPath = basename( $objFile["name"] );

if( move_uploaded_file( $objFile["tmp_name"], $strPath ) ) {
    print "The file " .  $strPath . " has been uploaded.";
} else {
    print "There was an error uploading the file, please try again!";
}

Von der Serverseite bekomme ich ein leeres Array für $ _FILES


7
2018-06-30 06:03


Ursprung


Antworten:


Ich werde ein Beispiel für Code geben. Überprüfen Sie, ob auf der Konsole ein Fehler auftritt.

// 1. config
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

// 2. if necessary set your Authorization HTTP (example api)
// [config setHTTPAdditionalHeaders:@{@"<setYourKey>":<value>}];

// 3. Finally, you create the NSURLSession using the above configuration.
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

// 4. Set your Request URL
NSURL *url = <yourURL>;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

// 5. Set your HTTPMethod POST or PUT
[request setHTTPMethod:@"PUT"];

// 6. Encapsulate your file (supposse an image)
UIImage *image = [UIImage imageNamed:@"imageName"];
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

// 7. You could try use uploadTaskWithRequest fromData
NSURLSessionUploadTask *taskUpload = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
    if (!error && httpResp.statusCode == 200) {

        // Uploaded

    } else {

       // alert for error saving / updating note
       NSLog(@"ERROR: %@ AND HTTPREST ERROR : %ld", error, (long)httpResp.statusCode);
      }
}];

0
2017-07-07 18:39



Wenn das der vollständige Code ist, dann bist du es eigentlich nicht beginnend der Upload NSURLSitzung Aufgaben werden nicht automatisch gestartet (im Gegensatz zu anderen NSURLConnection Anrufe). Sie müssen explizit ihre Lebenslauf-Methode aufrufen, um den Upload zu starten, oder die Aufgaben werden nur dort sitzen und nichts tun.

Zweitens sollten Sie wirklich verwenden URLForResource anstatt einen Pfad zu verwenden und ihn dann in eine URL umzuwandeln. Das sollte Ihren Code nicht brechen, aber es ist viel sauberer, einfach nur URLs zu verwenden.

Drittens, wenn Sie wirklich einen Pfad verwenden müssen, bequeme Methoden (fileURLWithPath:) bist dein Freund.

Viertens müssen Sie nicht festlegen Inhaltslänge, und IIRC, sollten Sie wahrscheinlich nicht, weil Sie nicht wissen, was die Inhaltslänge tatsächlich sein wird, wenn NSURLSession jede Art von Codierung aushandelt (z. B. das Komprimieren der Dateidaten).

Fünftens, wenn die Datei groß ist, sind 30 Sekunden möglicherweise nicht lang genug.

Wenn Sie mit neueren Versionen von iOS oder OS X arbeiten, stellen Sie sicher, dass Sie entweder einen ordnungsgemäß konfigurierten HTTPS-Server verwenden oder eine geeignete App Transport Security-Ausnahme hinzugefügt haben.

Wenn Sie schließlich andere POST-Parameter einfügen möchten, anstatt nur den Datenblob als Anfragetext anzugeben, müssen Sie eine Streaming-Anfrage verwenden. Sie können GET-Parameter natürlich trivial verwenden, und das würde ich Ihnen empfehlen, weil es viel einfacher ist, Dinge zu tun. :-)


0
2018-05-01 05:19