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, или как я начинал писать сайт




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


Как сделать аппаратное сцепление
Педали для компьютера своими руками со сцеплением
Коробка передач для ПК своими руками
Светодиодный фонарик своими руками
Лабораторный блок питания на LM317 LM337 с предрегулятором



Главная



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


Здравствуйте! У меня другая проблема. Понадобилось изменить название таблицы в которой есть поле типа blob  и картинки перестали отображаться/загружаться - возможно это та же самая причины, но уже со стороны кодировки в БД!



vlad, 2018-02-10 16:35:44









Поиск