Я пытаюсь сохранить файлы в базе данных MySql на основе этой статьи . Прежде чем вы предложите мне хранить файлы в файловой системе, а не в базе данных, загруженные файлы будут сохранены и связаны с записями в базе данных. Я мог бы сохранить путь к файлам и только имена файлов, но я хочу, чтобы пользователи могли изменять и удалять файлы непосредственно через веб-интерфейс. Итак, давайте представим, что хранение в базе данных - хороший вариант, а не обсуждаем другие.
Моя проблема заключается в том, что, когда я захожу, чтобы загрузить файл, данные, возвращенные из BLOB в базе данных MySql, не совсем то, что я загрузил в тесте. Если я использую функцию addlashes , то в двоичном коде она полностью отключена. Если я уберу эту функцию из процедуры, то стану намного ближе.
Используя приложение Binary Diff, я вижу, что, не используя addlashes , возвращаемые данные файла содержат один дополнительный байт данных в начале файла и, в свою очередь, на один байт меньше в конце. Остальная часть данных файла смещена на единицу из-за этой небольшой функции загрузки.
Я использую ФОРМУ для отправки данных, и для enctype установлено значение multipart / form-data , как и должно быть. Вот код, который я использую, чтобы заставить все это работать. DAL в коде ссылается на класс, который я создал для моего уровня доступа к данным. Он обрабатывает все процедуры сохранения и извлечения и, похоже, не вводит никаких новых данных. Я проверил, посмотрев содержимое файла, прежде чем он перейдет в мой класс DAL для сохранения, и дополнительный байт уже есть.
загрузка
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fp = fopen($_FILES['userfile']['tmp_name'], 'r');
$_FILES['userfile']['content'] = fread($fp, $_FILES['userfile']['size']);
$_FILES['userfile']['content'] = addslashes($_FILES['userfile']['content']);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$_FILES['userfile']['name'] = addslashes($_FILES['userfile']['name']);
}
$fileDAL = new DAL("files");
$newID = $fileDAL->SaveItem($_FILES['userfile'], false);
echo "<br>File ".$_FILES['userfile']['name']." uploaded as ID $newID<br>";
}
скачать
if(isset($_GET['id']))
{
$id = $_GET['id'];
$objFiles = new DAL('files');
$objFile = $objFiles->GetItem($id);
header("Content-length: $objFile->size");
header("Content-type: $objFile->type");
header("Content-Disposition: attachment; filename=$objFile->name");
echo $objFile->content;
exit;
}