【问题标题】:How to get multiple file upload with different name如何以不同的名称上传多个文件
【发布时间】:2021-12-20 16:41:43
【问题描述】:

我想上传多个文件并获取要上传的文件名:

我有一个 type_demand 需要上传一些 type_file

例如:对于 type_demand A,我可以上传 type_file X、Y、Z

在我的 php 中,我想获取 3 个文件并知道 X、Y 和 Z 是什么。

这里是我的表单示例:

<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" 

enctype="multipart/form-data">
  

  <label for="type">Files to upload:</label>


  <div class="form-group row">
    <label for="FormControlFile1" class="col-sm-2 col-form-label">X</label>
    <input type="file" class="form-control-file col-sm-10" id="FormControlFile1" name="myfile[]">
  </div>

<div class="form-group row">
    <label for="FormControlFile2" class="col-sm-2 col-form-label">Y</label>
    <input type="file" class="form-control-file col-sm-10" id="FormControlFile2" name="myfile[]">
  </div>
 
<div class="form-group row">
    <label for="FormControlFile3" class="col-sm-2 col-form-label">Z</label>
    <input type="file" class="form-control-file col-sm-10" id="FormControlFile3" name="myfile[]">
  </div>
  

</div>

  <button type="submit" class="btn btn-primary" name="upload">Upload</button>
   
</form>

这是我的 php 代码:

<?php  
 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 
 if(isset($_FILES['myfile'])){
     $tmp_arr= $_FILES['myfile'];
 }
 // Create an array with desired structure.
 for($i=0; $i<count($tmp_arr['name']); $i++){
     $files[] = array(
         'name'     =>  $tmp_arr['name'][$i],
         'type'     =>  $tmp_arr['type'][$i],
         'tmpName'  =>  $tmp_arr['tmp_name'][$i],
         'error'    =>  $tmp_arr['error'][$i],
         'size'     =>  $tmp_arr['size'][$i],
    //i want to have another information here to know if it's X, Y or Z file 
     );
 }

 
foreach($files as $file){
         echo '<br/>'.$file['name'] .' is for :' ;
}

结果我想拥有例如:

NameOfFile1 用于:X

NameOfFile2 用于:Y

NameOfFile3 用于:Z

谢谢

【问题讨论】:

  • 那么 occ 0 将是第一个,occ 1 将是第二个等等
  • 我很想给他们打电话 name="myfile1"name="myfile2" 等等,然后你就知道是哪个了
  • 使用数组语法 - 即:myfile["NameOfFile1"]myfile["NameOfFile2"] 等 - 然后在 PHP 中很容易识别哪个是哪个

标签: php html forms file file-upload


【解决方案1】:

您应该能够为 HTML 中的字段分配名称(在合理范围内的任何名称),因为您已经在使用 array style 语法。例如:

<?php
    $field='myfile';
    $errors=array();

    
    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_FILES[ $field ] ) ){
        $obj=$_FILES[ $field ];
        
        foreach( $obj['name'] as $index => $void ){
            /*
                $index refers to the name assign in `myfile['fieldname']`
            */
            $name=$obj['name'][ $index ];
            $tmp=$obj['tmp_name'][ $index ];
            $error=$obj['error'][ $index ];
            $type=$obj['type'][ $index ];
            $size=$obj['size'][ $index ];
            $ext=strtolower(pathinfo($name,PATHINFO_EXTENSION));
            
            // do stuff...
            printf(
                '
                <h1>%s</h1>
                <pre>%s</pre>
                ',
                $index,
                print_r($obj,true)
            );
            
            //next
        }
    }
?>

以及修改后的 HTML 以包含 X,Y &amp; Z 作为名称。 ID 被移除,元素位于标签内,因为这意味着更少的 HTML 代码。

<form method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>Files to upload:</legend>
        
        <div class="form-group row">
            <label class="col-sm-2 col-form-label">
                X : <input type="file" class="form-control-file col-sm-10" name="myfile[X]">
            </label>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label">
                Y: <input type="file" class="form-control-file col-sm-10" name="myfile[Y]">
            </label>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label">
                Z: <input type="file" class="form-control-file col-sm-10" name="myfile[Z]">
            </label>
        </div>
    </fieldset>
    <button type="submit" class="btn btn-primary" name="upload">Upload</button>
</form>

【讨论】:

    【解决方案2】:

    无需重新发明轮子。

    jQuery File Upload Plugin (by heyageek) 可以满足您的所有需求,而且体积小且经过时间考验。 (我多年来一直在成功使用它)

    请注意,他有 client side (jQuery) 和 server (PHP) 的示例代码。

    您将需要查看formData 和/或dynamicFormData 功能,这些功能允许您在提交之前收集其他数据并将它们(连同上传的文件)发送到您的后端处理文件。

    dynamicFormData: function()
    {
        //var data ="XYZ=1&ABCD=2";
        var data ={"XYZ":1,"ABCD":2};
        return data;        
    }
    

    这是一个sample upload script,它将向您展示如何获取已上传文件的名称(参见第 18 行):

    $fileName = $_FILES["myfile"]["name"];
    

    请注意,myfile 与 javascript ajax 块中的文件名匹配:

    <script>
    $(document).ready(function()
    {
        $("#fileuploader").uploadFile({
        url:"YOUR_FILE_UPLOAD_URL",
        fileName:"myfile"
        });
    });
    </script>
    

    研究“入门”选项卡和“服务器端”(PHP 文件,顶部)上的示例,您将在几分钟内解决所有问题。

    参考

    这是另一个使用插件的示例:PHP file upload inside modal window

    【讨论】:

      猜你喜欢
      • 2011-09-27
      • 2013-01-29
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多