Я начинаю PHP, и я пытаюсь загрузить PDF в мою базу данных MySQL. Я попытался добавить код, чтобы сделать его совместимым с pdf, но он не работает, поэтому я удалил его, и у меня есть PHP-скрипт, который может загружать .txt, текстовые документы, изображения и т. Д., Но не PDF. Что вы предлагаете, я должен добавить к нему, чтобы он работал для PDF. Вот мой сценарий.
<html> <head></head> <body> <form method="post" enctype="multipart/form-data"> <table width="350" border="0" cellpadding="1" cellspacing="1" class="box"> <tr> <td>Select a file to upload</td> </tr> <tr> <td> <input type="hidden" name="MAX_FILE_SIZE" value="16000000"> <input name="userfile" type="file" id="userfile"> </td> </tr> <tr> <td width="80"><input name="upload" type="submit" class="box" id="upload" value=" Upload "></td> </tr> </table> </form> </body> </html> <?php if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) { $fileName = $_FILES['userfile']['name']; $tmpName = $_FILES['userfile']['tmp_name']; $fileSize = $_FILES['userfile']['size']; $fileType = $_FILES['userfile']['type']; $fileType=(get_magic_quotes_gpc()==0 ? mysql_real_escape_string( $_FILES['userfile']['type']) : mysql_real_escape_string( stripslashes ($_FILES['userfile']))); $fp = fopen($tmpName, 'r'); $content = fread($fp, filesize($tmpName)); $content = addslashes($content); fclose($fp); if(!get_magic_quotes_gpc()) { $fileName = addslashes($fileName); } $con = mysql_connect('localhost', 'root', '') or die(mysql_error()); $db = mysql_select_db('test', $con); if($db){ $query = "INSERT INTO upload (name, size, type, content ) ". "VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; mysql_query($query) or die('Error, query failed'); mysql_close(); echo "<br>File $fileName uploaded<br>"; }else { echo "file upload failed"; } } ?>
Вы должны сохранить это как двоичные данные. Таким образом, тип столбца BLOB
(или MEDIUMBLOB
и т. Д., В зависимости от того, насколько велики файлы, и сколько пользователь может загрузить). При этом не должно быть проблем с хранением практически любого типа содержимого файла.
Кроме того, я не думаю, что вы должны добавлять косые черты в контент и напрямую вставлять значения в запрос, вместо этого используйте параметры. Читайте на объектах данных PHP (PDO: http://php.net/manual/en/book.pdo.php ), который является очень хорошим и безопасным (если используется правильно!) Расширением для взаимодействия с базой данных.
Магические кавычки устарели долгое время. Вы больше не должны его использовать. Начиная с PHP 5.4 он удаляется с языка . Особенно, при написании новых скриптов вы должны избегать этой заброшенной функции.
Если ваш файл должен быть большим для обработки с использованием сценария загрузки файлов PHP, вам может быть интересно изменить настройки, такие как post_max_size
. См. Эту тему для получения более подробной информации: Увеличение максимального размера сообщения
Вместо использования функции addlashes , используемой для общего использования текста, вы должны использовать функцию escaping, соответствующую вашей системе баз данных. В этом случае это mysqli_real_escape_string . Поскольку файлы PDF содержат двоичные данные и не содержат текст, вы не должны добавлять и удалять косые черты при сохранении и после чтения (текстовая обработка). Просто выйдите из двоичного содержимого blob, используя соответствующую функцию MySQL при вставке данных в базу данных. Подходящий тип столбца для целых файлов – MEDIUMBLOB . Он позволяет использовать длину данных до ~ 16 МБ.
После того, как поговорили о php-стороне, еще несколько советов относительно MySQL. MySQL ограничивает длину отправляемых на него пакетов данных. Если вы используете общедоступную платформу хостинга (и нет выделенного сервера), вероятность того, что она будет ограничена только 1 МБ. Соответствующий параметр конфигурации – max_allowed_packet . Этот параметр ограничивает возможность хранения документов в базе данных. См. Эту тему для идей о том, как решить эту проблему.
По-моему, в большинстве случаев плохой идеей хранить целые документы в реляционной базе данных. Обычно я помещаю метаданные файла (размер, имя файла, тип MIME, …) в таблицу базы данных и сохраняю загруженные двоичные данные в каталоге обычной файловой системы, который не читается публике (например, /srv/uploads
) , Тогда ваши файлы могут стать такими большими, как вы хотите, не жертвуя производительностью своей базы данных.