Uploading Multiple Files To Server From Form

主宰稳场 提交于 2019-12-12 02:16:24

问题


I have a form from which I gather quite a bit of information and am then required to upload Multiple Files.

All other aspects of the form are now working perfectly thanks to Devi on this forum. And to try and focus on only the one problem I now have I have decided to start the new thread: The previous / old thread can be viewed Insert into one Table, while updating another & File Upload

My problem now is to actually get the files to upload. My form is working in two parts. Part one is the basic HTML layout which then has the method pointing to the PHP file which handles the writing of info to the database tables.

The form has the following code for each file upload (There are 4 uploads, each for a different file reference, ie. License Document, Renewal Document, Identity Document, Other Documents):

<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 -->

And the relevant processing part is

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();

I have also confirmed my rot directory and ensured that there is an /uploads/ folder present.


回答1:


If don't see the definition, but it MUST have the enctype like

The $_FILES variable works with the name of the field in the form. On your example it should be scanned_permit_renewal. And for access it from the PHP when the form was sent you should use $_FILES['scanned_permit_renewal'].

You uses on the foreach

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

Which seems to be the problem.

IMHO you should use this:

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:


You have done everything right, you are simply not pointing to the right input names...

$_FILES['file'] does not exist. You should use $_FILES['scanned_permit_renewal'] instead just like when you access $_POST, the key is the name of the form field.

Actually, you are looping through the $_FILES['file'] as if you had put many inputs with the name file[*something*]. If you question is complete, you should simply be using

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);
}

To answer your comment, an efficient way of doing it could be 2 ways. First, which will require no PHP changes, rename your input fields to file[scanned_permit_renewal] this will let you use the foreach as you seem to intend.

Another way could be to use an array of possible inputs:

$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);
    }
}

A third way could be to just loop through the $_FILES array. But I wouldn't do that, as there could be anything there. You'll prefer to filter on your wanted files.




回答3:


For uploading multiple files, input field should be:

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

processing part:

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


来源:https://stackoverflow.com/questions/41691657/uploading-multiple-files-to-server-from-form

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!