简体   繁体   中英

Uploading Multiple Files To Server From Form

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.

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM