GRIG
Новичок
Привет всем. Прошу помощь зала по следующей ситуации.
Есть база данных Oracle. В ней есть некая таблица. В этой таблице в одной из колонок типа BLOB хранятся файлы, загруженные откуда-то извне. Файлы могут быть разных типов - картинки, PDF, DOC, DOCX, XLS, XLSX, ... - заранее неочевидно, в какой записи какой файл окажется.
Пользователь через броузер смотрит запись, к которой прикреплен файл, и тыкает на кнопку "скачать файл". Моя задача - выдать ему файл, чтобы пользователь сохранил его у себя для дальнейшей работы с ним.
Действую следующим образом (для простоты все обработки ошибок и несущественные подробности урезаны):
Запрос обрабатывается без ошибок, файл пользователю приходит. Однако есть проблема: в результате этого кода файл на компьютере пользователя оказывается на 1 байт длиннее оригинального файла, хранившегося в базе. Причем независимо от того, какого типа был переданный файл и какой длины, этот лишний байт всегда один и тот же - 0x0A (перевод строки). В некоторых случаях этим лишним байтом можно пренебречь. Но в других случаях программы просмотра соответствующих файлов считают этот лишний байт нарушением формата файла и ругаются.
Соответственно вопрос: откуда этот лишний байт может взяться? И как сделать так, чтобы его не было?
База данных вне подозрений: если тот же самый файл выгрузить из базы собственными средствами Oracle (например, Oracle SQL*Developer), то файл сохраняется нормально без всяких лишних байтов.
Библиотека доступа к базе данных тоже работает честно: если в тот же код в точку (1) вставить печать длины прочитанного файла - то выдается правильная длина без лишнего байта.
Есть база данных Oracle. В ней есть некая таблица. В этой таблице в одной из колонок типа BLOB хранятся файлы, загруженные откуда-то извне. Файлы могут быть разных типов - картинки, PDF, DOC, DOCX, XLS, XLSX, ... - заранее неочевидно, в какой записи какой файл окажется.
Пользователь через броузер смотрит запись, к которой прикреплен файл, и тыкает на кнопку "скачать файл". Моя задача - выдать ему файл, чтобы пользователь сохранил его у себя для дальнейшей работы с ним.
Действую следующим образом (для простоты все обработки ошибок и несущественные подробности урезаны):
PHP:
$sql = "SELECT TEMPLATE, FILE_NAME, FILE_TYPE FROM ... WHERE ...";
$desc = oci_new_descriptor( $conn, OCI_DTYPE_LOB );
$stmt = oci_parse( $conn, $sql );
oci_define_by_name( $stmt, "TEMPLATE", $desc, SQLT_BLOB );
oci_execute( $stmt, OCI_DEFAULT );
$image = oci_fetch_assoc( $stmt );
if( $image !== false )
{
header( "Content-type: " . $image['FILE_TYPE'] );
header( "Content-disposition: attachment; filename=" . str_replace( ",", "_", $image['FILE_NAME'] ) );
$file_content = $image['TEMPLATE']->load();
/* (1) */
echo $file_content;
}
else
echo "Ошибка чтения";
Соответственно вопрос: откуда этот лишний байт может взяться? И как сделать так, чтобы его не было?
База данных вне подозрений: если тот же самый файл выгрузить из базы собственными средствами Oracle (например, Oracle SQL*Developer), то файл сохраняется нормально без всяких лишних байтов.
Библиотека доступа к базе данных тоже работает честно: если в тот же код в точку (1) вставить печать длины прочитанного файла - то выдается правильная длина без лишнего байта.