无法将图像上传到服务器ios

您好,我正尝试从我的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的forms上传图像数据时,它最终在$_FILES 。 从PHP 4.3.0开始, $_REQUEST不再包含以这种方式上传的文件的任何信息。

代码的其余部分是基于图像不被上传为multipart的想法,而是以标准forms上传为base-64string。 您不需要将base 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最令人愤慨的事情。

您的上传代码不会尝试使用一次上传多个文件所需的PHP语法,因此您的PHP代码不需要担心内部数组本身的内容。 您可以消除foreach循环和所有对[$f]索引的引用。