PHP Загрузить на MySql - PullRequest
       1

PHP Загрузить на MySql

0 голосов
/ 28 июля 2011

Я пытаюсь сохранить файлы в базе данных 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;
}

Ответы [ 2 ]

0 голосов
/ 29 июля 2011

Оказывается, что я добавляю дополнительный перевод строки или возврат каретки в конец файла PHP, который был в моих заголовках до выполнения этого кода.Это привело к тому, что заголовок при записи включал перевод строки (OA) в двоичные данные для сохранения файла.

0 голосов
/ 28 июля 2011

использовать mysql_real_escape_string () .выдержка из его справочной страницы:

Экранирует специальные символы в unescaped_string, принимая во внимание текущий набор символов соединения, чтобы можно было безопасно разместить его в mysql_query (). Если двоичные данные должны быть вставлены, эта функция должна использоваться .

, поэтому я бы изменил экранирующую часть вашего кода на:

if( get_magic_quotes_gpc() )
{
    $_FILES['userfile']['name'] = stripslashes( $_FILES['userfile']['name'] );
}
$_FILES['userfile']['name'] = mysql_real_escape_string( $_FILES['userfile']['name'] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...