Привет, я пытаюсь загрузить изображение с моего устройства IOS на сервер.
И вот мой код для загрузки изображения
- (IBAction)btnUpload:(id)sender { if (self.imageViewGallery.image == nil) { UIAlertView *ErrorAlert = [[UIAlertView alloc] initWithTitle:@"Wait" message:@"Please Select An Image To Upload." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [ErrorAlert show]; NSLog(@"error"); } else{ NSData *imageData = UIImageJPEGRepresentation(self.imageViewGallery.image, 90); NSString *urlString = @"http://localhost/ColorPicker/api.upload.php"; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSString *imgName = LIbraryImage; NSLog(@"image name : %@",imgName); NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"files\"; filename=\"%@\"\r\n", imgName]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; NSLog(@"setRequest : %@", request); NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"returnstring is : %@",returnString); }
Теперь вот мой код на стороне сервера. Это немного длиннее.
<?php $Image = $_FILES['files']['name']; print_r($_FILES); foreach ($Image as $f => $name) { $allowedExts = array("gif", "jpeg", "jpg", "png"); $temp = explode(".", $name); $extension = end($temp); if ((($_FILES['files']['type'][$f] == "image/gif") || ($_FILES['files']['type'][$f] == "image/jpeg") || ($_FILES['files']['type'][$f] == "image/jpg") || ($_FILES['files']['type'][$f] == "image/png")) && ($_FILES['files']['size'][$f] < 2000000) && in_array($extension, $allowedExts)) { if ($_FILES['files']['error'][$f] > 0) { echo "Return Code: " . $_FILES['files']['error'][$f] . "<br>"; } else { if (file_exists("upload/" . $name)) { } else { move_uploaded_file($_FILES['files']['tmp_name'][$f], 'upload/' . uniqid() . "_" . $name); } } } else { $error = "Invalid file"; } } ?>
Теперь, что происходит каждый раз, когда я пытаюсь загрузить, это предупреждение
<b>Warning</b>: Invalid argument supplied for foreach() in <b>/Applications/XAMPP/xamppfiles/htdocs/ColorPicker/uploadAction.php</b> on line <b>5</b><br />
Когда вы загружаете данные изображения в виде multipart, оно заканчивается в $_FILES
. Начиная с PHP 4.3.0, $_REQUEST
больше не содержит никакой информации о файлах, загруженных таким образом.
Остальная часть вашего кода основана на идее, что изображение не загружается как multipart, а вместо этого загружается как строка base-64 в стандартной форме. Вместо того, чтобы записывать данные базы 64 в файл, вам просто нужно получить информацию о файле из $_FILES
и перенести его в целевой каталог с помощью move_uploaded_file
.
Из комментариев, что print_r
возвращается:
Array ( [files] => Array ( [name] => iphone.jpg [type] => application/octet-stream [tmp_name] => /Applications/XAMPP/xamppfiles/temp/php4VsKOv [error] => 0 [size] => 13484 ) )
Между тем, ваш код делает это:
$Image = $_FILES['files']['name']; print_r($_FILES); foreach ($Image as $f => $name) {
Вы обрабатываете $_FILES['files']['name']
как если бы это был массив, когда это не так. Вот почему PHP говорит «Недопустимый аргумент для foreach ()»
Обратите внимание, что он может стать массивом, если несколько файлов загружаются с тем же именем элемента формы. Это, безусловно, самая $_FILES
вещь о $_FILES
.
Ваш код загрузки не пытается использовать синтаксис PHP, необходимый для загрузки нескольких файлов одновременно, поэтому вашему PHP-коду не нужно беспокоиться о том, что содержимое внутреннего массива является массивом. Вы можете исключить цикл foreach
и все ссылки на индекс [$f]
.