2015-11-10 2 views
0

Мне нужно сохранить pdf-файл в BLOB (база данных MsSql 2012, но мне тоже нужно будет работать и в 2008 году).Сохранение PDF в BLOB (на сервере mssql) и вывод его обратно на веб-сайт (php)

Вот подборка того, что я пытался до сих пор:

(Файл where I save pdf into database)

function preparePDF2String($filepath) 
{ 
    $handle = @fopen($filepath, 'rb'); 
    if ($handle) 
    { 
     $content = @fread($handle, filesize($filepath)); 
     $content = bin2hex($content); 
     @fclose($handle); 
     return "0x".$content; 
    } 
} 

$out = preparePDF2String('pdf/pdf.pdf'); 
$q_blob = "INSERT INTO HISTORIA_ARCHIWUM_test(PDFName, PDFData) VALUES('First test pdf', $out) "; 

$r_blob = mssql_query($q_blob,$polacz); 

Results (ок, я думаю)

enter image description here

(Теперь PHP файл where I try to output the pdf)

// header('Content-type: application/pdf'); 
// readfile('pdf/pdf.pdf'); - this works just fine, so pdf is ok 


$q_blob = "select top 1 * from HISTORIA_ARCHIWUM_test"; 
$r_blob = mssql_query($q_blob,$polacz); 
$w_blob = mssql_fetch_array($r_blob); 

header('Content-type: application/pdf'); 
header('Content-Disposition: inline; filename="the.pdf"'); 

echo $w_blob['PDFData']; 
//echo hex2bin ($w_blob['PDFData']); - I also tried this - same problem 

Проблема: Когда я пытаюсь вывести pdf в браузере, я получаю ошибку (этот формат pdf не поддерживается). Он также не будет открыт в Adobe Reader. Я предполагаю, что я выводил это неправильно, но, может быть, это так, как я его сохраню?

+0

Почему бы не сохранить PDF-файл за пределами базы данных в файловой системе, сохраните ссылку на свой путь в базе данных и используете ли PHP ссылку (например, изображения)? Вы избегаете преобразования двоичного содержимого в строку. – Parfait

+0

Это мое требование для клиентов. Ему нужен большой pdf-репозиторий, который легко скопировать (автоматическое резервное копирование - один большой файл базы данных) –

ответ

2

EDIT от комментариев
кажется PHP + MSSQL обрезает строку, когда вы получите его из БД, но его управляемость в php.ini. Я установил mssql.textlimit = 160000 и mssql.textsize = 160000, и он отлично работает с преобразованием Hex и varchar (max).


Вы преобразуя данные в формате PDF, прежде чем сохранить его в базу данных, вы должны отменить преобразование, прежде чем ее вывод.

header('Content-type: application/pdf'); 
header('Content-Disposition: inline; filename="the.pdf"'); 

echo hex2bin(substr($w_blob['PDFData'], 2)); 

Также почему вы преобразовываете данные в первую очередь, просто сохраните их как двоичные.

+0

Извините за задержанный ответ (у меня не было доступа - вчера был нерабочий день здесь). Я попытался отменить трансфремацию, но без sucess - я попробовал пару hex2binary функций (в том числе из php.net), и у всех есть проблемы. Странно, потому что в базе данных все нормально. Вы sugession, чтобы не делать преобразования, возможно, наилучшим образом, но у меня есть проблема с этим. Если я прочитаю pdf и попытаюсь сохранить его в двоичном формате, я получаю: Warning: mssql_query() [function.mssql-query]: message: Идентификатор, начинающийся с '.....', слишком длинный. Максимальная длина - 128. До сих пор я не мог справиться с этим. –

+1

Какое поле является PDFData? Попробуйте использовать VARBINARY (MAX) – Musa

+0

Это VARBINARY (MAX) - и когда подумать об этом, это может быть проблемой, если я делаю преобразование в HEX :) (я предполагаю, что varbinary означает только двоичный код). Мне нужно выяснить, как чтобы мой запрос работал без преобразования. Действительно простой тест: INSERT INTO HISTORIA_ARCHIWUM_test (PDFName, PDFData) VALUES («Первый тест pdf», $ out), где read is read pdf. –