Извлечение файла из базы.

Solenko

Новичок
Извлечение файла из базы.

Здравствуйте.
Понимаю, что эта тема уже всем изрядно надоела, но на поиск просьба не посылать -- пользовался.
Проблеммы заключается в следующем: файл сохранятся в базу нормально, а вот при извлечении и отдаче пользователю оказывается, что не хватает нескольких десятков байт.
Сохраняю файл в базу так:
PHP:
$query = "INSERT INTO #__userfiles (file_caption ,file_name, file_size, file_data, user_id, upload_date) VALUES ";
$query .= "('".$caption."', '".$_FILES['up_file']['name']."',".$_FILES['up_file']['size'].", ";
$query .="'".base64_encode(fread(fopen($_FILES['up_file']['tmp_name'], 'rb'), filesize($_FILES['up_file']['tmp_name'])))."', ".$my->id.", now())";
$database->setQuery($query);
$database->query();
Извлекатя пытаюсь так:
PHP:
$query = "select file_data, file_name FROM #__userfiles WHERE id = ".$id;
$database->setQuery($query);
$database->loadObject($r);
header("Content-type: application/octet-stream");
header("Content-Disposition: inline; filename=\"".$r->file_name."\""); 
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo base64_decode($r->file_data);
Поле file_data имеет тип LONGBLOB, а размер файлов не привышает 1 Mb.
Подскажите что я сделал не так и в чем причина "недостачи" байтов.

П.С. Еще одна просьба, не превращать тему в дискуссию по поводу целесообразности хранения хранения файлов в базе.
 

Solenko

Новичок
StUV, смотрел размер записи в базе и срвнивал с тем, что приходит с сервака без перекодировки.
Размеры отличались все на те-же 20-200b в зависимости от размера файла.

SiMM, addslashes был первый вариант -- эффект тот же.
 

StUV

Rotaredom
Solenko
если сохранить файл с размером несколько байт - все нормально ?
 

WDStalker

Новичок
Solenko как происходит нарушение целостности файла. В начале, в конце, по файлу?
 

Solenko

Новичок
StUV, да с совсем маленькими файлами все Ок.
Загрузил большой тектовик, разница всего в 2 байта. Причем визуально я ее даже заметить не сомг.
Вот результат сравнения (построчного). При бинарном сравнении разницы 11 метров :(
Сравнение файлов 2upload.txt и 2UPLOAD1.TXT
***** 2upload.txt

The Apache HTTP Server Project

***** 2UPLOAD1.TXT
The Apache HTTP Server Project

*****

-~{}~ 10.07.06 19:28:

Попробовал сравнить jpg. Первый сбойный байт на смещении 625, ну и дальше до конца файла...

PS. Венрнуля от base64 к add(strip)slashes.
 

SiMM

Новичок
Смотреть надо не смещение сбойного байта, а его значение. В оригинале и в базе. Да и ссылка, что я дал, вовсе не про addslashes (хотя это уже зависит от используемой БД), и stripslashes вообще не при делах.
И, кстати, до кучи - исключите обёртку - сохраните данные в базе без всяких классов, напрямую, функциями для работы с используемой вами БД. В общем, фдибаг.
 

Solenko

Новичок
SiMM
Смешение Ор. После базы
00000625: 5C 34
Лично мне это ничего не говорит. (в базе как-то не очень удобно считать, учитывая слеши).
К сажолению, ни первая ни вторая ссылка, которую Вы привели мне не помогла. Тут варианта 2 :
-- я не смог ими воспользоватся
-- они не относятся к обсуждемой теме
Может вы укажете болле точно, что именно полезного я должен был вынести из этих FAQов?
 

SiMM

Новичок
> 00000625: 5C 34
Первое - это слэш (\), второе - это четвёрка (4)
Вам же уже было сказано - stripslashes - не при делах, о чём и в FAQ упоминается - почему вы его используете, когда достаёте данные из базы?
 

Solenko

Новичок
SiMM. Огромное спасибо. Прошу извинить за выпады в вашу сторону.
При первом просмотре не заметил ключевой фразы:

Следует специально отметить: добавленные слеши НЕ идут в базу. Они нужны только в запросе. При попадании в базу слеши отбрасываются. Соответственно, распространенной ошибкой является применение stripslashes при получении данных из базы.
 
Сверху