从表单上载多个文件到服务器

时间:2017-01-17 07:52:24

标签: php multiple-file-upload

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

表格的所有其他方面现在完全得益于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 /文件夹。

3 个答案:

答案 0 :(得分:0)

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

$_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数组。但我不会这样做,因为那里可能有任何东西。您更愿意过滤您想要的文件。

答案 1 :(得分:0)

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

的enctype

$ _FILES变量使用表单中字段的名称。 在您的示例中,它应该是scanning_permit_renewal。并且在表单发送时从PHP访问它应该使用$ _FILES ['scanning_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 :(得分:0)

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

<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 ..... "; 
    }
}
}