我有一个表单,我从中收集了大量信息,然后需要上传多个文件。
表格的所有其他方面现在完全得益于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 /文件夹。
答案 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 ..... ";
}
}
}