Home / Posts / Web, PHP, HTML / Mysql. Нюанс работы с BLOB полями /


Mysql. Нюанс работы с BLOB полями



Иногда может потребоваться хранить в BLOB - полях картинки и прочие файлы. Я также воспользовался этим полем, при этом возник нюанс, о котором напишу позже.

Для начала - универсальный код для работы с полем выглядит так:

1. Запрос на создание таблицы.

CREATE TABLE upload (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
type VARCHAR(30) NOT NULL,
size INT NOT NULL,
content MEDIUMBLOB NOT NULL,
PRIMARY KEY(id)
);

 

2. Форма загрузки файла.

<form method="post" action = "upload.php" enctype="multipart/form-data">
<table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
<tr> 
<td width="246">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input name="userfile" type="file" id="userfile">
 
</td>
<td width="80"><input name="upload" type="submit" class="box" id="upload" value=" Upload "></td>
</tr>
</table>
</form>

 

3. Файл upload.php, который загружает файл в базу.

<?php
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}
include 'library/config.php';
include 'library/opendb.php';
$query = "INSERT INTO upload (name, size, type, content ) ".
"VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
mysql_query($query) or die('Error, query failed');
include 'library/closedb.php';
echo "<br>File $fileName uploaded<br>";
}
?>

 

4. Скрипт, формирующий список ссылок на загруженные файлы.

<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
include 'library/config.php';
include 'library/opendb.php';
$query = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
echo "Database is empty <br>";
}
else
{
while(list($id, $name) = mysql_fetch_array($result))
{
?>
<a href="download.php?id=<?php=$id;?>"><?php=$name;?></a> <br>
<?php
}
}
include 'library/closedb.php';
?>
</body>
</html> 

 

5. Файл download.php, непосредственно открывающий файлы.

<?php
if(isset($_GET['id']))
{
include 'library/config.php';
include 'library/opendb.php';
$id = $_GET['id'];
$query = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
$result = mysql_query($query) or die('Error, query failed');
list($name, $type, $size, $content) = mysql_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;
include 'library/closedb.php';
exit;
}
?> 

 

В данном виде браузер будет скачивать файлы. Чтобы картинка открывалась, нужно закомментировать строчки: 

//header("Content-length: $size");
//header("Content-Disposition: attachment; filename=$name");

 

Все эти примеры взяты из руководства PHP-MYSQL-TUTORIAL

http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/uploading-files-to-mysql-database.aspx

Никаких затруднений я с работой скриптов не испытал, за исключением вышеупомянутого подводного камня.

В чем его суть - картинка загружалась в базу, но не читалась - отображалось пустое место, как будто бы фотографии нет на сервере. При попытке скачать изображение выяснялось что оно "повреждено". Так же было и с pdf-файлом. Текст, латиница, записанная в blob читалась нормально.

При этом, если картинку загрузить через phpMyAdmin, все прекрасно читается.

Выяснилось, что проблема в кодировке подключения к MySql. Данные из BLOB всегда читаются в ANSI. (Информация с некого форума).

Следовательно - нужно немного изменить код в файле opendb.php - там где подключается база данных.

// соединяемся с сервером базы данных
$connect_to_db = mysql_connect($db_host, $db_username, $db_password) or die("Could not connect: " . mysql_error());
// подключаемся к базе данных
mysql_query("SET NAMES 'ansi'");
mysql_query("SET CHARACTER SET 'ansi'");

 

В общем, две последние строчки задающие кодировку. У меня там раньше было utf-8. После изменения файлы стали читаться нормально. 


,






Еще статьи по теме


Tinymce. Вставка примеров кода на страницу html
Антиспам для комментариев, или как обойтись без капчи
Tinymce. Вставка видео на сайт
Особенности моей CMS, или как я начинал писать сайт




Свежие статьи


Часы на газоразрядных индикаторах ИН-8
Инфракрасный барьер своими руками
Светодиодное освещение - продолжение эволюции
Часы на газоразрядных индикаторах ИН-12 (Nixie Clock)
Светодиодное освещение своими руками



Главная



Комментарии (0)











Мужской Проект

Подписка


Поиск