Загрузка Нескольких Файлов На Сервер Из Формы

У меня есть форма, из которой я собираю довольно много информации, а затем требуется загрузить несколько файлов.

Все остальные аспекты формы теперь работают отлично благодаря 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/ folder present.

3 ответа

  1. Вы все сделали правильно, вы просто не указываете на правильные входные имена…

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

    Чтобы ответить на ваш комментарий, эффективный способ сделать это может быть 2 способа. Во-первых, который не потребует никаких изменений 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массив. Но я бы не стал этого делать, так как там может быть что угодно. Вы предпочтете фильтровать нужные файлы.

  2. Если не видеть определение, но он должен иметь enctype как

    Переменная $_FILES работает с именем Поля в форме.
    На вашем примере это должно быть scanned_permit_renewal. А для доступа к нему из PHP при отправке формы следует использовать $_FILES [‘scanned_permit_renewal’].

    Вы используете на foreach

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

    Что, похоже, и является проблемой.

    IMHO вы должны использовать это:

    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);
    }
    
  3. Для загрузки нескольких файлов поле ввода должно быть:

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