2015-06-30 3 views
7

Ниже приведен фрагмент для загрузки файла изображения. Я хочу использовать только NSURLSessionUploadTask, поскольку он предоставляет функцию фоновой загрузки, которую я хочу использовать в своем приложении.NSURLSessionUploadTask не удалось загрузить файл

Также я хочу параметр POST вместе с загрузкой файла.

Кроме того, я не очень хорошо разбираюсь в серверном коде. Может кто-нибудь подскажет мне, что я делаю неправильно.

Загрузить код

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 код

<?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!"; 
} 

Со стороны сервера я получаю пустой массив для $ _FILES

ответ

0

вложу пример кода. Проверьте, есть ли на консоли какие-либо ошибки.

// 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

Я использую фоновый сеанс не по умолчанию, также в обработчике фона не допускается обработчик завершения. Также NSData как изображение не допускается как изображение. – Mukesh

0

Если это полный код, то вы на самом деле не начиная загрузки. NSURLSession задачи не запускаются автоматически (в отличие от некоторых NSURLConnection звонки). Вы должны явно вызвать их метод возобновления, чтобы начать загрузку, или задачи будут просто сидеть и ничего не делать.

Во-вторых, вы действительно должны использовать URLForResource, а не использовать путь, а затем преобразовать его в URL-адрес. Это не должно нарушать ваш код, но намного проще использовать URL-адреса для начала.

В-третьих, если вам действительно нужно использовать путь, удобные методы (fileURLWithPath:) являются вашим другом.

В-четвертых, вам не нужно устанавливать Content-Length и IIRC, вы, вероятно, не стоит, потому что вы не знаете, что длина контента будет на самом деле, если NSURLSession ведет переговоры какой-либо кодирования (например, сжатие данных файла).

В-пятых, если файл большой, 30 секунд может быть недостаточно длинным.

В-шестых, если вы работаете в более новых версиях iOS или OS X, убедитесь, что используете либо правильно настроенный сервер HTTPS, либо добавили подходящее исключение для безопасности приложений.

И, наконец, если вы хотите включить другие параметры POST, а не просто предоставить кадр данных в качестве тела запроса, вам придется использовать запрос на потоковое вещание. Конечно, вы можете использовать параметры GET тривиально, и я бы рекомендовал вам это сделать, потому что это гораздо более простой способ сделать что-то. :-)

Смежные вопросы