正在上传文件 - >数组/单个文件

时间:2016-12-03 06:36:32

标签: php file upload

我已经找到了将文件发送到" upload.php"的表单。 " upload.php的"将上传的文件移动到目标目录并生成缩略图。

  • 问题/问题:一个表单只发送一个文件,所以在此 case upload.php没有获得$ _FILES数组。 (输入类型="文件"名称="文件">)。此表单是从移动设备发送的,我不知道如何将文件对象更改为数组,因此我无法更改此
  • 另一个表单发送带有一个或多个文件的文件数组(输入类型="文件"名称="文件[]">。

在我的upload.php中,我使用foreach遍历文件数组:

foreach($_FILES['file']['tmp_name'] as $key => $tmp_name ){
    $new_image_name = $key.$_FILES['file']['name'][$key];
    $file_tmp =$_FILES['file']['tmp_name'][$key];
    $dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name;
    move_uploaded_file($file_tmp, $dest);
    // and so on...
}

使用发送文件数组的表单,它可以完美运行。 但是你可以想象只发送一个文件的表单并没有通过foreach。

那么最好的解决方案是让upload.php适用于这两种形式吗? 我的想法:upload.php首先要检查,如果$ Files是一个数组,如果没有将它转换为数组。然后foreach将始终获得一个数组

1 个答案:

答案 0 :(得分:1)

好吧,如果上传文件,$ _FILE变量始终是一个上传单个或多个文件的数组。

让我们说一下多个文件,多个文件的$ _FILE变量的典型映射就像..

    Array
    (
        [file] => Array
            (
                [name] => Array
                    (
                        [file1] => MyFile.txt
                        [file2] => MyFile.jpg
                    ),

                [type] => Array
                    (
                        [file1] => text/plain
                        [file2] => image/jpeg
                    ),

                [tmp_name] => Array
                    (
                        [file1] => /tmp/php/php1h4j1o
                        [file2] => /tmp/php/php6hst32
                    ),

                [error] => Array
                   (
                       [file1] => UPLOAD_ERR_OK
                       [file2] => UPLOAD_ERR_OK
                   ),

                [size] => Array
                   (
                       [file1] => 123
                       [file2] => 98174
                   )
        )
)

所以,对于多个文件上传,假设我想从多个文件上传中访问['tmp_name'],例如$temp_name = $_FILES['file']['tmp_name'],那么$temp_name将包含一个数组,

不同之处在于,对于单个文件上传,$temp_name = $_FILES['file']['tmp_name']; $temp_name将包含一个字符串,即上传的单个文件的一个字符串。

现在,我们实际上可以将它转换为数组并使其看起来像多次上传,如果我写$temp_name = (array)$_FILES['file']['tmp_name']现在$temp_name文件将包含一个数组,基本上就是单个字符串,但包含在索引为0的数组中。

现在单个和多个文件上传看起来相似吗?

因此,基于此,您可以修改代码,如..

// lets be sure that $_FILES are not empty 
if( !empty( $_FILES ) ) { // I might did this check already, if so, ignore it

    // now we are going to type cast the $_FILE variable as an array

      foreach( (array) $_FILES['file']['tmp_name'] as $key => $tmp_name ){

       $file_names = (array) $_FILES['file']['name']; // just ensuring that single file name is in array format

       $new_image_name = $key.$file_names[$key]; // no worries about the $key! 
       $file_tmp = $tmp_name[$key];

       $dest=$_SERVER['DOCUMENT_ROOT']."uploads/".$new_image_name;
       move_uploaded_file($file_tmp, $dest);
        // and so on...
      }

    }

现在,这将适用于您的两种情况,如果在foreach foreach( (array) $_FILES['file']['tmp_name'] as $key => $tmp_name )中只有1个文件,(数组)强制转换将确保$_FILES['file']['tmp_name']将包含至少1个tmp_name的数组,对于多次上传,它已经是一个数组!

我在$file_names = (array) $_FILES['file']['name'];做了同样的事情,以确保总会有一个名称数组,至少包含一个名称用于单个文件上传案例。

您可以以相同的方式访问其他值。

希望有意义:))