如何以不同的名称上传多个文件

How to get multiple file upload with different name

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

我要上传 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

谢谢

您应该能够将名称(在合理范围内您想要的任何名称)分配给 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 & 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>

无需重新发明轮子。

jQuery File Upload Plugin(由 heyageek 编写)可以满足您的所有需求,并且体积最小且经过时间考验。 (我已经成功使用多年了)

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

您需要查看 formData and/or 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