0

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

多亏了这个论坛上的 Devi,表单的所有其他方面现在都可以完美运行。为了尝试只关注我现在遇到的一个问题,我决定启动新线程:可以查看上一个/旧线程插入一个表,同时更新另一个和文件上传

我现在的问题是实际获取要上传的文件。我的表格分为两部分。第一部分是基本的 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/ 文件夹。

4

3 回答 3

0

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

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

实际上,您正在遍历 ,$_FILES['file']就好像您已经使用 name 输入了许多输入一样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]this 将让您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数组。但我不会那样做,因为那里可能有任何东西。你会更喜欢过滤你想要的文件。

于 2017-01-17T08:02:29.830 回答
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 ..... "; 
    }
}
}
于 2017-01-17T08:10:58.560 回答
0

如果看不到定义,但它必须具有类似的 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);
}
于 2017-01-17T08:09:08.787 回答