Здравствуйте! На одном проекте возникла необходимость хранить пдф файлы в базе данных.
Сохраняю в поле longBLOB след. кодом:
include '../../connect.php';
$table = "".$prefix."test01";
$city = "city";
if ($handle = opendir(''.$_SERVER['DOCUMENT_ROOT'].'/wp-content/themes/domen/cities/'.$citie.'/bills/bill_files')) {
echo "Файлы в папке:<br>";
$log ='';
$file_name = null;
while (false !== ($file = readdir($handle))) {
if(preg_match("|.pdf$|",$file)){
if($file_name !== $file){
echo "$file<br>";
$pieces = explode(".", $file);
$id = $pieces[0];
echo $id;
$upload=file_get_contents(''.$_SERVER['DOCUMENT_ROOT'].'/wp-content/themes/domen/cities/'.$citie.'/bills/bill_files/'.$file.'');
$ins=sprintf("UPDATE $table SET bill ='%s' WHERE id='$id'",mysql_real_escape_string($upload));
mysql_query($ins);
if (mysql_errno()) {echo mysql_errno() . '\n' . mysql_error() . '\n';}
if (!$ins){$log .= "Ошибка копирования данных из файла ".$file."$date<br>". PHP_EOL;}
else {$log .= "Данные из файла ".$file." скопированны в базу $date<br>". PHP_EOL;}
$file_name = $file;
}
}
}
echo $log;
}
Вывожу обратно так:
header("Content-Type: application/pdf");
include '../../connect.php';
$table = "".$prefix."test01";
$id = "0001";
$result="SELECT bill FROM $table WHERE id='".$id."'";
$result = mysql_query($result);
$row = mysql_fetch_array($result);
echo $row['bill'];
При использовании Chrome на выходе получается исходный пдф. Но при его сохранении и попытке открытия - Файл поврежден.
Если добавить строку чтобы файл скачивался сразу
header("Content-Disposition:attachment;filename='pdf.pdf'");
получается файл pdf.pdf с размером 0 байт.
Подскажите, как правильно выводить pdf из базы данных, заранее спасибо!
В итоге проблема оказалась в этой строке при загрузке файла:
$ins=sprintf("UPDATE $table SET bill ='%s' WHERE id='$id'",mysql_real_escape_string($upload));
Убрал экранирование и изменил на
$ins = "UPDATE $table SET bill ='".$upload."' WHERE id='".$id."'";
Все заработало корректно.
За советы всем огромное спасибо! Согласен, что хранить в базе не самое лучшее решение, но сайт сейчас лежит на виртуальном хостинге и доступа к настройкам nginx я не имею, а сделать нужно "вчера"!:-) Поэтому приходится искать быстрое решение. В ближайшее время буду переносить сайт на выделенный сервак и там буду пытаться реализовать через nginx (спасибо
Дмитрий Филимонов и @valerium).