2017-01-17 8 views
0

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

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

Я также подтвердил мой каталог гнили и гарантировал, что есть/добавление/папка присутствует.

+0

JFYI, этот сайт не является форум и вопрос, требующие исправить ваш код, не соответствуют теме. –

ответ

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

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

+0

Итак, для каждого файла, который я хочу добавить, мне нужно будет добавить раздел кода, который говорит if (isset ($ _ FILES ["file"] ["name"])) { foreach ($ _ FILES ['file'] [ 'tmp_name'] как $ key => $ tmp_name) и т. д.?? Был бы или нет более простой/более эффективный способ сделать это? –

+0

Хорошо, вариант два выглядит лучше всего для меня, так как мне нужно записать значение поля в 4 отдельных столбца в моей таблице базы данных, чтобы впоследствии я мог ссылаться на имя файла, чтобы отобразить его. Моя первая попытка использовать массив входов не помогла, поэтому позвольте мне попробовать работать через него. –

+0

Возможно, вы не захотите использовать исходное имя файла, так как могут возникнуть конфликты имен ... Я бы предпочел использовать идентификатор строки mysql, относящийся к файлам, и добавить тип файла. Таким образом, вам не нужно хранить имена файлов в базе данных, и если два разных человека используют одно и то же имя файла, они не будут перезаписывать друг друга, что может стать очень вредным. – Salketer

0

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

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

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

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

Это был бы идеальный способ для меня, моя единственная проблема заключается в том, что я хочу также записать имя файла в конкретный столбец в моей таблице, один столбец для отсканированного разрешения, затем документ, удостоверяющий личность, и т. Д. Чтобы я мог использовать ссылку в базе данных, чтобы вытащить конкретный файл и отобразить его. –

 Смежные вопросы

  • Нет связанных вопросов^_^