Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно сохранять изображения в Mysql через php
 
 автор: DOB   (17.01.2008 в 02:43)   письмо автору
 
 

Проблемма вот в чём: никак не получается либо правельно сохранить либо правельно вывести изображения в БД mysql с помощью php, облазил кучу сайтов прочитал кучу инфы, а в итоги либо поле BLOB содержит несколько байт после обработчика а при выводе даёт крестик вместо картинке, либо выводит набор забавных значков. Пробывал сохранять как в базе так и в файле а в базе пути и название картинки всеравно одно и тоже. Если кто знает обьясните пожалусто в чем здесь фишка, и если нетрудно какойнибуть работуещий пример. Спасибо!

   
 
 автор: cheops   (17.01.2008 в 02:55)   письмо автору
 
   для: DOB   (17.01.2008 в 02:43)
 

>поле BLOB содержит несколько байт после обработчика
А в смысле после обработчика?

> ибо выводит набор забавных значков
А HTTP-заголовки, сообщающие браузеру, что это изображение вы отправляете? Вы с каким форматом изображений работаете?

   
 
 автор: DOB   (17.01.2008 в 03:15)   письмо автору
 
   для: cheops   (17.01.2008 в 02:55)
 

jpeg , gif только я так понимаю что выводится не картинка я её код

   
 
 автор: cheops   (17.01.2008 в 03:33)   письмо автору
 
   для: DOB   (17.01.2008 в 03:15)
 

Отправляется HTTP-заголовок
<?php
  header
("Content-type: image/jpeg");
?>

перед выводом содержимого JPEG-изображения?

   
 
 автор: DOB   (17.01.2008 в 03:19)   письмо автору
 
   для: cheops   (17.01.2008 в 02:55)
 

"обработчик" я имелл в виду программу обрабатываящу форму с информацией

   
 
 автор: cheops   (17.01.2008 в 03:34)   письмо автору
 
   для: DOB   (17.01.2008 в 03:19)
 

В обработчике нет пробелов (или других символов) после ?> или перед <? и вообще в обработчике выводится только изображение и ничего больше?

   
 
 автор: DOB   (17.01.2008 в 04:09)   письмо автору
 
   для: cheops   (17.01.2008 в 03:34)
 

>В обработчике нет пробелов (или других символов) после ?> или перед <? и вообще в обработчике выводится только изображение и ничего больше?

Я имел ввиду программу на ввод информации в базу,
а на вывод проверил всё чисто.

   
 
 автор: cheops   (17.01.2008 в 04:33)   письмо автору
 
   для: DOB   (17.01.2008 в 04:09)
 

.

   
 
 автор: DOB   (17.01.2008 в 03:44)   письмо автору
 
   для: cheops   (17.01.2008 в 02:55)
 

Вот например с текстовами полями всё понятно там содиржимое поля заносится в переменную и выдается браузеру, а вот с картинками как не крутил не выходит

$res=mysql_query("SELECT * from fotos")
         or die("SQL ERROR in line ".__LINE__.", function mysql_query");
  $image=mysql_result($res, 1, foto); 
  header("Content-type: image/gif");
  echo $image;

Вот что сдесь не правильно?

   
 
 автор: cheops   (17.01.2008 в 04:32)   письмо автору
 
   для: DOB   (17.01.2008 в 03:44)
 

Поле foto является типа BLOB перед вставкой значений в него проводите экранирование символов при помощи функции mysql_real_escape_string().

   
 
 автор: DOB   (17.01.2008 в 05:20)   письмо автору
 
   для: cheops   (17.01.2008 в 04:32)
 

>экранирование символов при помощи функции mysql_real_escape_string().

Уменя в общей сложности получился следующий код на ввод информации в БД, подскажите там всё правильно если да зна чит проблемма с выводом изображения!


<?
$link 
mysql_connect("localhost","registr","12345") OR die("Incorrect username or password");
mysql_select_db("registr") OR die ("Access denied !");

// Добавление файла в таблицу
function uploadFile$filename$mimetype$tmp_name$filesize ) {
  if ( 
$file = @fopen$tmp_name"rb" ) ) {
    
// Прочитать содержимое временного файла
    
$filebody fread($file$filesize);
    
fclose$file );
    
// Удалить временный файл - сам сервер может об этом забыть
    
unlink$tmp_name );

    
// Заэкранировать символы, непонятные для MySQL
    
$filebody mysql_real_escape_string($filebody);

    
// Вставить запись в таблицу

$query="insert into filetable (mimetype,filename, filesize, filebody) values ('$mimetype', '$filename', 

'
$filesize', '$filebody')";
$result=mysql_query ($query) or die ("Ошибка ввода информации в таблицу!");

    
// Проверяем, что получилось
    
if ( $result ) {
      
$result 
        
mysql_query("SELECT MAX(fileid) AS id FROM filetable");
      if (
$row mysql_fetch_array($result))
        return 
$row[id]; // Занесено, возвращаем идентификатор
    
} else {
      
// print mysql_error()."<br>\n";
      // Ошибка занесения в БД
    
}
  } else {
    
// Ошибка загрузки файла
  
}
}

mysql_close($link);

?>
<!-- 
поле MAX_FILE_SIZE ограничивает допустимый размер файла (в байтах)
-->
<form METHOD="POST" ENCTYPE="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1200000">
<input type="hidden" name="filename" value="">
<input type="hidden" name="MAX_FILE_SIZE" value="1200000">
Файл: <input type=file name=myfile>
<input type=submit name=upload value="Загрузить файл">
</form>

   
 
 автор: cheops   (17.01.2008 в 15:02)   письмо автору
 
   для: DOB   (17.01.2008 в 05:20)
 

А сама функция uploadFile() как вызывается?

   
 
 автор: DOB   (17.01.2008 в 15:54)   письмо автору
 
   для: cheops   (17.01.2008 в 15:02)
 

Вывод происходит вот так:

<?
$link 
mysql_connect("localhost","registr","12345") OR die("Incorrect username or password");
mysql_select_db("registr") OR die ("Access denied !");

function 
getFileByName$fname ) {
  
// Извлечение всех полей для файла с заданным именем.
  // При этом дополнительно преобразуем время обновления 
  // из формата MySQL TIMESTAMP (YYYYMMDDhhmmss) 
  // в число секунд от начала эры UNIX.
  
$result mysql_query( <<<ENDQUERY
    SELECT *, UNIX_TIMESTAMP(updtime) AS updtime1 
      FROM filetable WHERE filename='
$fname'
ENDQUERY
);
  return 
mysql_fetch_array($result);
}

// Получение имени файла
$fname substrfiletable(PATH_INFO));

// Берем файл из базы
$row getFile$fname );

if ( !
$row ) {
  
// Если такого файла нет - возвращаем клиенту код ошибки
  
echo "Фаил не обнаружен";
} else {
  
// Время, когда файл был загружен.
  // Преобразуется из формата UNIX_TIMESTAMP
  // в формат RFC 822, в котором дату должен возвращать сервер.
  
$lastmodif date("r"$row[updtime1]);

  
// Эти 2 поля позволяют кэшировать переданный файл.
  // Разрешить кеширование
  
header("Cache-Control: public");
  
// Передать время модификации
  
header("Last-Modified: ".$lastmodif);

  
header("Content-type: ".$row[mimetype]);

  
// Передать тело файла
  
print $row[filebody];
}

mysql_close($link);
?>

   
 
 автор: DOB   (17.01.2008 в 20:11)   письмо автору
 
   для: DOB   (17.01.2008 в 15:54)
 

Люди ну помагите чем смогу отблогадарю?

P.S. - Очень надо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования