Php 上载文件-->;阵列/单个文件

Php 上载文件-->;阵列/单个文件,php,file,upload,Php,File,Upload,我已经准备好了表单,它们都将文件发送到“upload.php”。 “Upload.php”将上载的文件移动到目标目录并生成缩略图 问题:一个表单只发送一个文件,所以在这个表单中 case upload.php没有获得$\u FILES-array。(输入type=“file”name=“file”>)。此表单是从移动设备发送的,我不知道如何将文件对象更改为数组,因此无法更改此表单 另一个表单发送一个包含一个或多个文件的文件数组(input type=“file”name=“file[]”>)

我已经准备好了表单,它们都将文件发送到“upload.php”。 “Upload.php”将上载的文件移动到目标目录并生成缩略图

  • 问题:一个表单只发送一个文件,所以在这个表单中 case upload.php没有获得$\u FILES-array。(输入type=“file”name=“file”>)。此表单是从移动设备发送的,我不知道如何将文件对象更改为数组,因此无法更改此表单
  • 另一个表单发送一个包含一个或多个文件的文件数组(input type=“file”name=“file[]”>)
在my 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将始终获得一个数组。如果上载了文件,$\u FILE变量始终是一个数组,您可以上载单个或多个文件

假设有多个文件,多个文件的$\u 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\u name',比如,
$temp\u name=$\u文件['file']['tmp\u name']
,那么
$temp\u name
将包含一个数组

不同之处在于,对于单个文件上载,
$temp\u name=$\u FILES['file']['tmp\u name']
$temp\u name
将包含一个字符串,即上载单个文件的一个字符串

现在,我们可以将其强制转换为数组,并使其看起来像是多个上载,同样对于单个文件,如果我编写
$temp\u name=(数组)$\u FILES['file']['tmp\u name']
现在
$temp\u 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((数组)$\u FILES['file']['tmp\u name']as$key=>$tmp\u name)
中只有1个文件,(数组)强制转换,将确保
$\u FILES['file']['tmp\u name']
将包含一个至少有1个tmp\u名称的数组,并且对于多次上载,它已经是一个数组了

我在
$file\u names=(array)$\u FILES['file']['name'];
上做了同样的事情,以确保始终存在一个名称数组,其中至少包含一个文件上传案例的名称

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


希望它有意义:)

看起来不错。对于一个文件上载,您的html必须如下所示:

 <form action="" method="post" enctype="multipart/form-data" >
     <input type="file" name="file[]">
     <button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button>
 </form>

上传照片
这是2个文件的上传:

 <form action="" method="post" enctype="multipart/form-data" >
     <input type="file" name="file[]">
     <input type="file" name="file[]">
     <button name="submit" type="submit" class="btn btn-default save_change_btn">upload photo</button>
 </form>

上传照片

您只需在两种表单中使用相同的文件名,
name=“file[]”
。方括号使PHP生成数组结构。