Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Загрузка файлов на сервер с записью пути в БД MySQL с описанием файла на php
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Загрузка файлов на сервер с записью пути в БД MySQL с описанием файла на php

Страниц (1): [1]
 

1. dus2003 - 13 Февраля, 2020 - 23:12:03 - перейти к сообщению
Добрый день.
Требуется осуществить загрузку нескольких файлов на сервер в папку: "file/Доходные/" в определенную папку, путь до файла записать в БД в табл. fddoc с полями ID_FDВ (ID записи), ID_DDOC (ID родительской записи БД из табл. ddoc), Namefddoc (Описание файла), NameFDD (Имя файла), PathFDD (путь до файла).
Представленный ниже исходный код рабочий. Но не так как хотелось бы.
Как работает этот код:
В форме загрузки нажимаеш кнопку выбора файлов, открывается окно выбора, выбираешь один или несколько фалов, нажимаешь кнопку Добавить и все выбранные файлы записываются в папку,а соответствующая информация в БД. вроде все ништяк (хороший код, мне очень нравится, можете использовать его), но, в табл БД fddoc есть поле "Namefddoc" (Описание файла, например - "Приложение №1 к договору") и данное описание должно быть к каждому файлу который я загружаю. Но данный код мне не дает такой возможности и я не знаю как это реализовать.
Для понимания: я знаю delphi но не знаю php, поэтому прошу давать разъяснения так же развернуто как я попытался задать вопрос.
Заранее СПАСИБО.
Прикладываю скриншот формы загрузки-чтобы легче было понять!


Исходный код следующий:

upload.php (форма загрузки)
...
echo "<table>";
echo "<form action='saveupload.php' method='post' enctype = 'multipart/form-data'>";
echo "<input type='hidden' name='myVariable' value='". htmlentities($IDDDFORUPLOAD)."'>";//Передача ID_DD доходного договора в saveupload.php
echo "<tr height='40px'>";
echo "<td><label>Добавить файл:</label></td>";
echo "<td><input name='namef1' size='30' type='text' maxlength='45' placeholder='Название документа'></td>";
echo "<td><input name='file[]' type='file' multiple></td>";
echo "</tr>";
echo "</table><br />";
echo "<input type='submit' name='add' value='Добавить'>";
echo "&nbsp;&nbsp;&nbsp;<input type='reset' name='res' value='Очистить форму'>";
echo "&nbsp;&nbsp;&nbsp;<input type='button' name='backl' value='Отмена' OnClick='backlist();'>";
echo "</form>";
...

saveupload.php (исполняющий запись файл)
...
$t=$_POST['myVariable'];
if($res_docvrf == '1'){ //Идентификатор записи доходного договора

// Название <input type="file">
$input_name = 'file';
// Разрешенные расширения файлов.
$allow = array();
// Запрещенные расширения файлов.
$deny = array(
'phtml', 'php', 'php3', 'php4', 'php5', 'php6', 'php7', 'phps', 'cgi', 'pl', 'asp',
'aspx', 'shtml', 'shtm', 'htaccess', 'htpasswd', 'ini', 'log', 'sh', 'js', 'html',
'htm', 'css', 'sql', 'spl', 'scgi', 'fcgi'
);
// Директория куда будут загружаться файлы.
$path = __DIR__ . '/file/Доходные/';

if (isset($_FILES[$input_name])) {
// Проверим директорию для загрузки.
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
// Преобразуем массив $_FILES в удобный вид для перебора в foreach.
$files = array();
$diff = count($_FILES[$input_name]) - count($_FILES[$input_name], COUNT_RECURSIVE);
if ($diff == 0) {
$files = array($_FILES[$input_name]);
} else {
foreach($_FILES[$input_name] as $k => $l) {
foreach($l as $i => $v) {
$files[$i][$k] = $v;
}
}
}
foreach ($files as $file) {
$error = $success = '';

// Проверим на ошибки загрузки.
if (!empty($file['error']) || empty($file['tmp_name'])) {
switch (@$file['error']) {
case 1:
case 2: $error = 'Превышен размер загружаемого файла.'; break;
case 3: $error = 'Файл был получен только частично.'; break;
case 4: $error = 'Файл не был загружен.'; break;
case 6: $error = 'Файл не загружен - отсутствует временная директория.'; break;
case 7: $error = 'Не удалось записать файл на диск.'; break;
case 8: $error = 'PHP-расширение остановило загрузку файла.'; break;
case 9: $error = 'Файл не был загружен - директория не существует.'; break;
case 10: $error = 'Превышен максимально допустимый размер файла.'; break;
case 11: $error = 'Данный тип файла запрещен.'; break;
case 12: $error = 'Ошибка при копировании файла.'; break;
default: $error = 'Файл не был загружен - неизвестная ошибка.'; break;
}
} elseif ($file['tmp_name'] == 'none' || !is_uploaded_file($file['tmp_name'])) {
$error = 'Не удалось загрузить файл.';
} else {
// Оставляем в имени файла только буквы, цифры и некоторые символы.
$pattern = "[^a-zа-яё0-9,~!@#%^-_\$\?\(\)\{\}\[\]\.]";
$name = mb_eregi_replace($pattern, '-', $file['name']);
$name = mb_ereg_replace('[-]+', '-', $name);

// Т.к. есть проблема с кириллицей в названиях файлов (файлы становятся недоступны).
// Сделаем их транслит:
$converter = array(
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',

'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E',
'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K',
'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R',
'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '',
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
);
$name = strtr($name, $converter);
$parts = pathinfo($name);

if (empty($name) || empty($parts['extension'])) {
$error = 'Недопустимое тип файла';
} elseif (!empty($allow) && !in_array(strtolower($parts['extension']), $allow)) {
$error = 'Недопустимый тип файла';
} elseif (!empty($deny) && in_array(strtolower($parts['extension']), $deny)) {
$error = 'Недопустимый тип файла';
} else {
// Чтобы не затереть файл с таким же названием, добавим префикс.
$i = 0;
$prefix = '';
while (is_file($path . $parts['filename'] . $prefix . '.' . $parts['extension'])) {
$prefix = '(' . ++$i . ')';
}
$name = $parts['filename'] . $prefix . '.' . $parts['extension'];

// Перемещаем файл в директорию.
if (move_uploaded_file($file['tmp_name'], $path . $name)) {
// Далее можно сохранить название файла в БД и т.п.
$success = 'Файл «' . $name . '» успешно загружен.';
$tes = mysqli_query($link, "INSERT INTO fddoc SET NameFDD='".$name."',PathFDD='".$path."', ID_DDOC='".$t."'");
} else {
$error = 'Не удалось загрузить файл.';
}
}
}
// Выводим сообщение о результате загрузки.
if (!empty($success)) {
echo '<p>' . $success . '</p>';
} else {
echo '<p>' . $error . '</p>';
}
}
}
}
...
2. Vladimir Kheifets - 16 Февраля, 2020 - 07:52:33 - перейти к сообщению
dus2003 пишет:
Добрый день.
Требуется осуществить загрузку нескольких файлов на сервер в папку: "file/Доходные/" в определенную папку, путь до файла записать в БД в табл. fddoc с полями ID_FDВ (ID записи), ID_DDOC (ID родительской записи БД из табл. ddoc), Namefddoc (Описание файла), NameFDD (Имя файла), PathFDD (путь до файла).
Представленный ниже исходный код рабочий. Но не так как хотелось бы.
Как работает этот код:
В форме загрузки нажимаеш кнопку выбора файлов, открывается окно выбора, выбираешь один или несколько фалов, нажимаешь кнопку Добавить и все выбранные файлы записываются в папку,а соответствующая информация в БД. вроде все ништяк (хороший код, мне очень нравится, можете использовать его), но, в табл БД fddoc есть поле "Namefddoc" (Описание файла, например - "Приложение №1 к договору") и данное описание должно быть к каждому файлу который я загружаю. Но данный код мне не дает такой возможности и я не знаю как это реализовать.

Добрый день!
Вам необходимо добавить в форму поле Namefddoc для ввода описания файла и сохранить введённое описание.

1. Изменяем upload.php (форма загрузки) см. скриншот.
обратите внимание на то, что в каждой строке echo можно не писать.
Спойлер (Отобразить)

2. Изменяем saveupload.php (исполняющий запись файл)
Если поле Namefddoc необязательно для заполнения, стр. 14-17 можете убрать.
Спойлер (Отобразить)
добавляем поле Namefddoc в поле mysqli_query
Спойлер (Отобразить)

Удачи!
3. dus2003 - 16 Февраля, 2020 - 14:49:54 - перейти к сообщению
Спасибо большое. Но!!!!
Вариант который Вы предложили не подходит.
Дело в том что, данный метод загрузки предусматривает выбор и загрузку нескольких фалов, но не дает возможности добавить несколько описаний файлов. Т.е. мне требуется чтобы я к каждому файлу добавил описание (например для файла №1 - Описание №1, для файла №2 - Описание №2 и т.д.).
А при том варианте который вы предложили - я выбираю несколько файлов а описание вводится одно на всех, и поэтому в БД описание файла дублируется для каждого загруженного файла.
я так полагаю, что вообще придется переделать весь код загрузки по типу "выбрал файл -> ввел описание -> нажал Добавить" после происходит запись данных в БД и высвечивается всплывающее окно "Хотите ли вы добавить еще файл? Да/Нет" (типа пошагово загружать каждый файл)

Огромное спасибо за ваш ответ.
Буду думать дальше.
4. Vladimir Kheifets - 16 Февраля, 2020 - 16:16:07 - перейти к сообщению
dus2003 пишет:
Спасибо большое. Но!!!!
Вариант который Вы предложили не подходит.
Дело в том что, данный метод загрузки предусматривает выбор и загрузку нескольких фалов, но не дает возможности добавить несколько описаний файлов. Т.е. мне требуется чтобы я к каждому файлу добавил описание (например для файла №1 - Описание №1, для файла №2 - Описание №2 и т.д.).
А при том варианте который вы предложили - я выбираю несколько файлов а описание вводится одно на всех, и поэтому в БД описание файла дублируется для каждого загруженного файла.
я так полагаю, что вообще придется переделать весь код загрузки по типу "выбрал файл -> ввел описание -> нажал Добавить" после происходит запись данных в БД и высвечивается всплывающее окно "Хотите ли вы добавить еще файл? Да/Нет" (типа пошагово загружать каждый файл)

Огромное спасибо за ваш ответ.
Буду думать дальше.

Если Вы в одной форме хотите ввести несколько файлов и к ним несколько описаний, то можно добавить несколько элементов textarea задав name="Namefddoc[]"

 

Powered by ExBB FM 1.0 RC1