无法将图片上传至服务器 ios

3

您好,我正在尝试从我的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 />

你的 PHP 中运行了哪个 else 块?是“无 POST”还是“错误”? - sffc
每次都不发帖... - Saad Chaudhry
1
print_r($_FILES) 的输出是什么? - Charles
请发布 print_r($ _FILES) 的输出。 - Brian Nickel
先生,它返回以下数组: 数组 (     [文件] => 数组         (             [名称] => iphone.jpg             [类型] => application/octet-stream             [tmp_name] => /Applications/XAMPP/xamppfiles/temp/php4VsKOv             [错误] => 0             [大小] => 13484         )) - Saad Chaudhry
这些人不允许对 PHP Web 服务进行任何更改,他们建议转换为 iOS 代码,而我认为 iOS 代码已经很完美了,不是吗? - Saad Chaudhry
2个回答

2

从评论中可以看到,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]索引的引用。

1
当您将图像数据作为多部分上传时,它最终会出现在$_FILES中。自PHP 4.3.0以来,$_REQUEST不再包含以此方式上传的任何文件信息。
您的其余代码是基于图像不作为多部分上传而是作为标准表单中的base-64字符串上传的想法。您只需要从$_FILES获取有关文件的信息,并使用move_uploaded_file将其移动到目标目录,而不是将base 64数据写入文件。

是的。使用 print_r($_FILES) 验证文件已上传,然后重写 PHP。 - Brian Nickel
先生,我已经做了一些更改,请您帮忙看一下。 - Saad Chaudhry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接