【问题标题】:Uploading files --> Array / single file上传文件 --> 数组/单个文件
【发布时间】:2017-04-18 02:51:38
【问题描述】:

我需要将文件发送到“upload.php”的表单。 “Upload.php”将上传的文件移动到目标目录并生成缩略图。

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

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

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 总是会得到一个数组

【问题讨论】:

  • 您只需在两种格式中使用相同的文件名name="file[]"。方括号是 PHP 生成数组结构的原因。

标签: php file upload


【解决方案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...
      }

    }

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

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

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

希望它有意义:)

【讨论】:

    【解决方案2】:

    看起来不错。对于一个文件上传,您的 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 2017-11-17
      • 2012-10-12
      • 2019-08-11
      • 1970-01-01
      • 2021-01-21
      • 2016-05-01
      • 1970-01-01
      相关资源
      最近更新 更多