【问题标题】:Uploading Multiple Files To Server From Form从表单上传多个文件到服务器
【发布时间】:2017-01-17 07:52:24
【问题描述】:

我有一个表格,我从中收集了很多信息,然后需要上传多个文件。

感谢这个论坛上的 Devi,表单的所有其他方面现在都可以完美运行。为了尝试只关注我现在遇到的一个问题,我决定启动新线程:可以查看上一个/旧线程Insert into one Table, while updating another & File Upload

我现在的问题是实际获取要上传的文件。我的表格分为两部分。第一部分是基本的 HTML 布局,然后具有指向 PHP 文件的方法,该文件处理将信息写入数据库表。

表格对于每个文件上传都有以下代码(有 4 次上传,每个用于不同的文件参考,即许可证文件、续订文件、身份证件、其他文件):

<div class="form-group">
    <label>Permit Renewal :</label>
    <div class="input-group">
        <label>
        <input type="radio" class="minimal" value="0" <?php echo ($permit_renewal=='No')?'checked':'' ?> name="permit_renewal">
        No
        </label>

        <label>
        <input type="radio" class="minimal" value="1" <?php echo ($permit_renewal=='Yes')?'checked':'' ?> name="permit_renewal">
        Yes
        </label>
    </div>
</div>  
<div class="box-body">
<div class="form-group">    
    <div class="form-group">
        <label for="scanned_permit_renewal">Attach File</label>
        <input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal">
        <p class="help-block">Select a file to link to this outlet, the file name must be prefixed with the Outlet. E.g. 102987 - License 2016</p>
    </div>                  
</div><!-- /.form-group -->

而相关的处理部分是

if (isset($_FILES["file"]["name"])) {
    foreach($_FILES['file']['tmp_name'] as $key => $tmp_name){
        $file_name = $key.$_FILES['file']['name'][$key];
        $file_size =$_FILES['file']['size'][$key];
        $file_tmp =$_FILES['file']['tmp_name'][$key];
        $file_type=$_FILES['file']['type'][$key];  
        $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name;
        //echo $new_file;
        move_uploaded_file($file_tmp,$new_file);
    }
}   
if($res1){
    echo "Records added / updated successfully.";
}

header("refresh:2;url=../outlet_capture.php"); 
// close connection
$link->close();

我还确认了我的 rot 目录并确保存在 /uploads/ 文件夹。

【问题讨论】:

  • JFYI,这个网站不是一个论坛,要求修复你的代码的问题不在主题范围内。

标签: php multiple-file-upload


【解决方案1】:

如果没有看到定义,但它必须具有类似的 enctype

$_FILES 变量与表单中的字段名称一起使用。 在您的示例中,它应该是scanned_permit_renewal。要在发送表单时从 PHP 访问它,您应该使用 $_FILES['scanned_permit_renewal']。

你在 foreach 上使用

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

这似乎是问题所在。

恕我直言,你应该使用这个:

foreach($_FILES as $fieldNameInTheForm => $file)
{
    $file_name = $fieldNameInTheForm .$file['name'];
    $file_size =$file['size'];
    $file_tmp =$file['tmp_name'];
    $file_type=$file['type'];  
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name;
    //echo $new_file;
    move_uploaded_file($file_tmp,$new_file);
}

【讨论】:

    【解决方案2】:

    你做的一切都是正确的,你只是没有指向正确的输入名称......

    $_FILES['file'] 不存在。您应该使用$_FILES['scanned_permit_renewal'] 而不是,就像访问$_POST 时一样,键是表单字段的名称。

    实际上,您正在循环遍历$_FILES['file'],就好像您输入了许多名称为file[*something*] 的输入。如果你的问题是完整的,你应该只是使用

    if (isset($_FILES["scanned_permit_renewal"])) {
        $file_name = $_FILES['scanned_permit_renewal']['name'];
        $file_size =$_FILES['scanned_permit_renewal']['size'];
        $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name'];
        $file_type=$_FILES['scanned_permit_renewal']['type'];  
        $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name;
        //echo $new_file;
        move_uploaded_file($file_tmp,$new_file);
    }
    

    要回答您的评论,一种有效的方法可能是两种方法。首先,无需更改 PHP,将输入字段重命名为 file[scanned_permit_renewal],这样您就可以按照您的意图使用 foreach

    另一种方法是使用可能的输入数组:

    $file_inputs = array('scanned_permit_renewal','my','other','documents');
    foreach($file_inputs as $input_name){
        if (isset($_FILES[$input_name])) {
            $file_name = $input_name.$_FILES[$input_name]['name'];
            $file_size =$_FILES[$input_name]['size'];
            $file_tmp =$_FILES[$input_name]['tmp_name'];
            $file_type=$_FILES[$input_name]['type'];  
            $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name;
            //echo $new_file;
            move_uploaded_file($file_tmp,$new_file);
        }
    }
    

    第三种方法是循环遍历$_FILES 数组。但我不会那样做,因为那里可能有任何东西。你会更喜欢过滤你想要的文件。

    【讨论】:

    • 所以对于我要添加的每个文件,我都需要添加代码段 if (isset($_FILES["file"]["name"])) { foreach($_FILES ['file']['tmp_name'] as $key => $tmp_name) 等等...?会/或没有更简单/更有效的方法吗?
    • 好的,选项二看起来最适合我,因为我需要将字段值写入我的数据库表中的 4 个单独的列,以便我以后可以引用文件名来显示它.我第一次尝试使用输入数组没有奏效,所以让我尝试一下。
    • 您可能不喜欢使用原始文件名,因为可能存在名称冲突...我宁愿使用与文件相关的 mysql 行的 ID,并附加文件类型。这样您就不需要将文件名存储在数据库中,并且如果两个不同的人使用相同的文件名,他们不会相互覆盖,这可能会变得非常有害。
    • 或者,如果您想保持文件名不变,请将它们放在以行 ID 或唯一名称命名的文件夹中。
    • 老实说,我实际上并没有想到名称冲突。我当前对文件名的插入查询为每个“提交”创建一行。因此,每种文件类型在表中都有自己的列。
    【解决方案3】:

    要上传多个文件,输入字段应该是:

    <input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal[]" multiple="multiple">
    

    加工部分:

    if (count($_FILES["scanned_permit_renewal"]["name"]) > 0) {
    foreach($_FILES['scanned_permit_renewal']['tmp_name'] as $key => $tmp_name)
    {
        $file_name = $key.$_FILES['scanned_permit_renewal']['name'][$key];
        $file_size =$_FILES['scanned_permit_renewal']['size'][$key];
        $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name'][$key];
        $file_type=$_FILES['scanned_permit_renewal']['type'][$key];
        $file_to_save = date("Ymd_his") . "_" . $file_name;
        $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" .$file_to_save;
        //echo $new_file;
        if(move_uploaded_file($file_tmp,$new_file)){
            // update database
    
            $query = "UPDATE `table` SET `field_name` = '".$file_to_save."' WHERE ..... "; 
        }
    }
    }
    

    【讨论】:

    • 这对我来说是理想的方式,我唯一关心的是我还想将文件名写入表中的特定列,扫描许可证的一列,然后是身份证件等. 这样我就可以使用数据库中的引用来提取特定文件并显示它。
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2012-10-27
    • 2022-10-16
    • 2015-09-23
    • 2012-12-08
    • 2015-10-24
    相关资源
    最近更新 更多