Intereting Posts
Как проверить X-редактируемый запрос в laravel (на стороне сервера) Twitter Search API нет результатов php динамически создает меню навигации из многомерного массива Возможные ошибки PDOException (MySQL 5)? Как подсчитать общее количество сообщений из выбранных типов сообщений? PHP – Возвращает последнюю строку в файле? Добавление водяного знака в видео с помощью ffmpeg в php Учетная запись службы календаря Google с API-интерфейсом PHP oauth2.0 – Как получить доступ к календарям, которые не используются совместно Правильно закодируйте символы в почтовой форме PHP («Я» превращается в «I \ m») Как запустить PHP внутри CSS MySQLi num_rows возвращает 0 PHP: несколько SQL-запросов в одном операторе mysql_query Интеграция PHP CKEditor Доступ к данным, сохраненным в результате, возвращаемом из этого запроса Загрузите несколько файлов с помощью файла «Добавить» – требуется идентификатор из поля ввода

Почему NSURLSession uploadTaskWithRequest: fromData: не удается загрузить на php-сервер?

PHP-код работает отлично. Ive загружал файлы из html-формы на том же сервере. Загруженные файлы варьировались от 40K до 2.0M, поэтому его размер не был. Загрузка файлов активируется на сервере с PHP 5.3

Я нашел много сообщений, таких как этот (без ответа еще): https://stackoverflow.com/questions/19710388/using-nsurlsession-to-upload-an-image .

Это использует uploadTaskWithRequest: fromFile: вместо fromData: NSURLSession убедитесь, что загрузка выполнена

Это NSURLSessionDataTask вместо uploadTaskWithRequest: Нет данных, получающих с NSURLSession

И некоторые сообщения, которые, кажется, говорят, что uploadTaskWithRequest: fromData: просто не работает: NSURLSession: загрузка активов с переносом фона асинхронной загрузки с помощью NSURLSession не будет работать, но синхронный NSURLConnection делает и загружает изображение с iOS на PHP

Я сделал приложение таким образом, что он возвращает HTTP-код, и я получаю код 200. В файле error_log сервера ничего нет после загрузки. Кажется, что все работает нормально, но что бы ни случилось, файл не записывается на сервер. Любые идеи, что еще я могу попытаться выяснить, что происходит не так?

Вот код php:

<?php $file=''; $uploaddir=''; //////////////// echo 'file count=', count($_FILES),"\n"; var_dump($_FILES); echo "\n"; //////////////// if(isset($_FILES['userfile']['name'])){ $uploaddir = './photos/'; //Uploading to same directory as PHP file $file = basename($_FILES['userfile']['name']); echo "file is set"; $uploadFile = $file; $randomNumber = rand(0, 99999); $newName = $uploaddir . $uploadFile; if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo "Temp file uploaded. \r\n"; } else { echo "Temp file not uploaded. \r\n"; } if (move_uploaded_file($_FILES['userfile']['tmp_name'], $newName)) { $postsize = ini_get('post_max_size'); //Not necessary, I was using these $canupload = ini_get('file_uploads'); //server variables to see what was $tempdir = ini_get('upload_tmp_dir'); //going wrong. $maxsize = ini_get('upload_max_filesize'); echo "\r\n" . $_FILES['userfile']['size'] . "\r\n" . $_FILES['userfile']['type'] ; } } ?> 

и вот код iOS:

 - (void)uploadImage:(UIImage*)image { // 0 Define URL NSData *imageData = UIImageJPEGRepresentation(image, 0.6); NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.myserver.com/app/photos/uploadPhoto.php"]]; NSString *boundary = @"0xKhTmLbOuNdArY"; NSString *filename = [NSString stringWithFormat:@"someName.jpg"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; // 4 Create object to put content into... NSMutableData *body = [NSMutableData data]; [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\" filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]]; //[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; //Not used with this:https://stackoverflow.com/questions/20893171/asynchronous-upload-with-nsurlsession-will-not-work-but-synchronous-nsurlconnect/20896632?noredirect=1#comment39074802_20896632 //[request setHTTPBody:body]; __block NSString *stringForText = @"Hola"; /////////////////////////////////////////////////// // 3 self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // ... NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) response; int errorCode = httpResponse.statusCode; NSString *errorStatus = [NSString stringWithFormat:@"%d",errorCode]; NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSString *totalResponse = [errorStatus stringByAppendingString:responseString]; stringForText = totalResponse; [self updateView:stringForText]; //UIAlertView *alertme = [[UIAlertView alloc] initWithTitle:@"error" message:totalResponse delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; //[alertme show]; // 4 self.uploadView.hidden = NO; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; }]; // 5 [_uploadTask resume]; } -(void)updateView:(NSString*)texto{ dispatch_sync(dispatch_get_main_queue(), ^{ self.myTextView.text = texto; }); } 

У меня есть 777 разрешений в этой папке. Как я уже сказал, Ive смог загрузить и, таким образом, записать в эту папку из того же php-скрипта через html-форму.

TotalResponse – 200 для кода ошибки http и count = 0, а также массив (0) {} для дампа php.

Вот образ ответа с сервера прямо в приложении: введите описание изображения здесь

Я добавил эти строки после повторного добавления файла Temp:

 $body = $HTTP_RAW_POST_DATA; echo "\n REQUEST" . $body; 

Но я только получил это:

 file count=1 array(1) { ["user file"]=> array(5) { ["name"]=> string(12) "DrinkCO2.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(14) "/tmp/phpxg7oLZ" ["error"]=> int(0) ["size"]=> int(190550) } } file is setTemp file uploaded. REQUEST 190550 image/png 

    Он не пропускал двоеточие, ему не хватало полуколонии.

     "name=\"userfile\" : filename=\"%@\"\r\n"" 

    Должно быть

     "name=\"userfile\"; filename=\"%@\"\r\n"" 

    По крайней мере, это единственный способ, которым ваш код работал для меня (спасибо, кстати!).

    У меня была проблема с полуколокой здесь ->

     "name=\"userfile\" ; filename=\"%@\"\r\n"" 

    Так было в основном уродливым телом.