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 :: Версия для печати :: Ошибка при отображении на WEB стринице загруженного из БД изображения
Форумы портала PHP.SU » » Работа с СУБД » Ошибка при отображении на WEB стринице загруженного из БД изображения

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

1. shurik_7866 - 11 Июля, 2015 - 19:44:56 - перейти к сообщению
Ошибка при попытке получить из базы и отобразить изображение
http://os7866[dot]co[dot]ua/scripts/get_[dot][dot][dot]g.php?image_id=1

При загрузке через FireFox выдает ошибку "Изображение 'http://os7866.co.ua/scripts/get_img.php?image_id=1' не может быть загружено так как содержит ошибки.

При загрузке через google chrome просто вместо изображения отображается маленький квадратик

На форумах в интернете пишут что ошибка связана с тем что изображение загрузилось не поностью

Для того что бы проверить добавил фрагмент кода по сохранению полученного изображения из БД на диск
PHP:
скопировать код в буфер обмена
  1. $dst = fopen("loaded_img.JPG","w");
  2. fwrite($dst, $image["image_data"]);
  3. fclose($dst);

Изображение на диск сохранилось полностью и без глюков: http://os7866[dot]co[dot]ua/scripts/loaded_img[dot]JPG

То есть ошибка связано исключительно с отображением изображения
.
Не хотелось бы каждый раз при отображении изображения из БД сначала сохранять на диск

Подскажите кто знает, с чем связана ошибка.

Ниже привожу скрипт по загрузке картинки
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once "../../param.php";
  3.  
  4. mysql_connect(DB_HOST, DB_USER, DB_PASSW) or
  5. die("<p>Ошибка подключения к серверу MySQL: ".mysql_error()."</p>");
  6.  
  7. mysql_select_db(DB_NAME) or
  8. die("<p>Ошибка подключения к базе данных: ".mysql_error()."</p>");
  9.  
  10. if (!isset($_REQUEST["image_id"])) die("<p>Ошибка: не указано image_id</p>");
  11. $image_id = $_REQUEST["image_id"];
  12.  
  13. $query = sprintf("select * from images where image_id = %d;", $image_id);
  14. $result = mysql_query($query);
  15. if (!$result) die("<p>Ошибка при выполнении запроса: ".mysql_error()."</p>");
  16. if (mysql_num_rows($result) == 0) die("<p>Отсутствует изображение с image_id = {$image_id}</p>");
  17. $image = mysql_fetch_array($result);
  18.  
  19. //-----------------------------------------
  20. $dst = fopen("loaded_img.JPG","w");
  21. fwrite($dst, $image["image_data"]);
  22. fclose($dst);
  23. //-----------------------------------------
  24.  
  25. header('Content-type: ' . $image['mime_type']);
  26. header('Content-length: ' . $image['file_size']);
  27. echo $image["image_data"];
  28. ?>
2. Viper - 11 Июля, 2015 - 22:57:40 - перейти к сообщению
shurik_7866 описание к fopen внимательно читали? Очень внимательно?
Абзацы "Замечание: " почитайте ещё раз.
3. shurik_7866 - 12 Июля, 2015 - 16:51:15 - перейти к сообщению
Viper пишет:
shurik_7866 описание к fopen внимательно читали? Очень внимательно?
Абзацы "Замечание: " почитайте ещё раз.


Фрагмент кода
PHP:
скопировать код в буфер обмена
  1. $dst = fopen("loaded_img.JPG","w");
  2. fwrite($dst, $image["image_data"]);
  3. fclose($dst);

только для того чтобы убедиться что изображение из базы в переменную считано, что успешно проверено http://os7866[dot]co[dot]ua/scripts/loaded_img[dot]JPG

При чем сдесь какие то особенности функции fopen, если изображение извлеченное из БД было успешно сохранено на диск? С fopen никаких проблем.
4. Viper - 12 Июля, 2015 - 17:25:50 - перейти к сообщению
Ок. Как сохраняете изображение в БД?
5. shurik_7866 - 12 Июля, 2015 - 17:38:43 - перейти к сообщению
Viper пишет:
Ок. Как сохраняете изображение в БД?


PHP:
скопировать код в буфер обмена
  1.     <?PHP
  2.  
  3.       $error_code=isset($_FILES["user_pic"]["error"]) ? $_FILES["user_pic"]["error"]: -1;
  4.       if ($error_code == 0){
  5.         if (@is_uploaded_file($_FILES["user_pic"]["tmp_name"])){
  6.           if (@getimagesize($_FILES["user_pic"]["tmp_name"])){
  7.             $filename = $_FILES["user_pic"]["name"];
  8.             $mime_type = $_FILES["user_pic"]["type"];
  9.             $file_size = $_FILES["user_pic"]["size"];        
  10.             $image_data = file_get_contents($_FILES["user_pic"]["tmp_name"]);
  11.                              
  12.             $filename=mysql_real_escape_string($filename);
  13.             $mime_type=mysql_real_escape_string($mime_type);
  14.             $image_data=mysql_real_escape_string($image_data);
  15.             $query = "insert into images(filename, mime_type, file_size, image_data) ".
  16.                       "values('{$filename}', '{$mime_type}', {$file_size}, '".$image_data."');";
  17.                          
  18.             mysql_query($query)
  19.             or die("<p>Ошибка при вставке в таблицу images: ".mysql_error()."</p>");
  20.           }
  21.           else{//error_block
  22.             $error_code = -1;
  23.             $error_msg = "Ошибка: загруженный файл не является изображением";                
  24.           }
  25.         }
  26.         else{//error_block
  27.           $error_code = -1;
  28.           $error_msg = "Ошибка: файл был загружен не через HTTP POST";        
  29.         }
  30.        
  31.       }
  32.      ?>
6. Мелкий - 12 Июля, 2015 - 18:06:34 - перейти к сообщению
Сохраните вывод скрипта и посмотрите бинарник hex-редактором.
Наиболее вероятно, что там какой-то лишний вывод.
7. shurik_7866 - 12 Июля, 2015 - 18:11:50 - перейти к сообщению
Мелкий пишет:
Сохраните вывод скрипта

А как сохранить вывод скрипта?
8. Мелкий - 12 Июля, 2015 - 18:18:27 - перейти к сообщению
Что значит "как"?
Любым HTTP-клиентом запрашиваете скрипт и сохраняете ответ.
9. shurik_7866 - 12 Июля, 2015 - 18:41:37 - перейти к сообщению
Да, сохранил(Сохранить страницу как), страница сохранилась как файл с расширением jpg. Но при попытке посмотреть как изображение jpg выдало ошибку - просмотр недоступен
посмотрел HEX редактором

есть три доп символа в начале файла которых нет в оригинальном изображении, и отсутствует три символа в конце файла которые есть в оригинальном изображении

CODE (htmlphp):
скопировать код в буфер обмена
  1. EF BB BF            п»ї................                    лишние
  2. .
  3. .
  4. 35 FF D9            ..............5яЩ                    отсутствуют


После удаления лишних символов в начале файла, файл стал открываться как картинка.

Но пока не понятно - чего добавляются эти символы
10. Мелкий - 12 Июля, 2015 - 18:44:09 - перейти к сообщению
BOM-метка UTF-8.
Сохраните скрипт без BOM.

Последние 3 байта отсутствуют из-за заявленного Content-length. Скрипт отправил всё, но клиент в сумме с BOM получил больше обещанного и отбросил лишнее.
11. shurik_7866 - 12 Июля, 2015 - 19:06:24 - перейти к сообщению
Мелкий пишет:
Сохраните скрипт без BOM.

Перекодировал скрипт из UTF-8 в UTF-8 без BOM и заработало. Теперь скрипт http://os7866[dot]co[dot]ua/scripts/get_[dot][dot][dot]g.php?image_id=1 показивает изображение.

Спасибо.

Проблема решена.

 

Powered by ExBB FM 1.0 RC1