Почему мои изображения хранятся в виде длинных блобов MySQL и отображаются только частично? - PullRequest
2 голосов
/ 24 февраля 2009

Клиент только что попросил меня исправить проблему с его сайтом. Я не построил это, но вот что происходит.

Изображения хранятся в БД как длинные шарики. До перехода на новый сервер все работало нормально. На новом сервере некоторые изображения отображаются только частично. Даже если изображение отображается с желаемой шириной и высотой, более половины изображения либо белого, либо серого цвета. РЕДАКТИРОВАТЬ: затрагиваются только изображения, загруженные после смены сервера!

Используется для чтения изображения в строку для вставки в БД:

move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")) 
$tmpstr = fopen("tmppic.img","rb");
$image = addslashes(fread($tmpstr,filesize("tmppic.img")));

Вот функции PHP, используемые для отображения изображений: imagecreatefromstring, imagecreatetruecolor, imagecopyresampled, imagejpeg

Поскольку это начало происходить после перемещения сервера, я подозреваю, что конфигурация сервера.

Что происходит?

Ответы [ 6 ]

3 голосов
/ 26 февраля 2009

Хорошо, разобрался. Глядя на код ниже.

if (move_uploaded_file($_FILES['imagefile1']['tmp_name'],"tmppic.img")){
$tmpstr = fopen("tmppic.img","rb");
$image = addslashes(fread($tmpstr,filesize("tmppic.img")));

Загруженный файл перемещается в файл tmppic.img. Этот файл постоянно используется. Проблема в том, что filesize ("tmppic.img") возвращает размер файла до move_uploaded_file. Таким образом, если предыдущий файл tmppic.img имел размер файла 120 КБ, а новый загруженный файл больше, считывается информация только на 120 КБ, то есть серая область на изображениях.

Я исправил проблему, заменив размер файла ("tmppic.img") на

$file_size = $_FILES['imagefile1']['size'];
$image = mysql_real_escape_string(fread($tmpstr,$file_size));

Это ошибка?

3 голосов
/ 24 февраля 2009

Не знаю, если это то, что вас убивает, но вам определенно нужно изменить addslashes() на mysql_real_escape_string(). Впрыск SQL ахой ...

1 голос
/ 02 ноября 2010

УБЕДИТЕСЬ, что поля изображения имеют правильный тип BLOB.

У меня была та же проблема, и это было чертовски простое решение; В моем поле изображения было установлено значение «Blob», а не «LongBlob». Моя БД не смогла выделить достаточно места в поле для хранения данных изображения. Изменил его на LongBlog, и он отлично работает!

0 голосов
/ 24 февраля 2009

Какую библиотеку MySQL вы используете? В некоторых версиях библиотеки MySQLi есть проблемы с корректным извлечением больших двоичных объектов из базы данных.

Я бы подтвердил, что вы используете одинаковые версии PHP и соответствующую библиотеку MySQL на обоих серверах.

0 голосов
/ 24 февраля 2009

Если изображения были перенесены на новый сервер через ftp, возможно, что режим передачи был установлен неправильно (то есть ascii против двоичного). Если вы передаете двоичный файл в режиме ascii ftp, он может интерпретировать некоторые байты изображения как новые строки и пытаться преобразовать их в режим windows (CRLF) или UNIX (LF) и т. Д. Это обычно приводит к повреждению изображения, поэтому оно не полностью читаемо.

0 голосов
/ 24 февраля 2009

Возможно, что данные были повреждены во время перемещения сервера, особенно если данные были сброшены, а затем снова вставлены. Можете ли вы подтвердить, что все данные изображения на самом деле находятся в базе данных?

Редактировать: только что видел ваши изменения в вопросе. Можете ли вы подтвердить, что новые изображения полностью вставляются в базу данных? Это может быть проблема с вставкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...