Страница 1 из 2

Отдача картинки

Добавлено: 2010.08.06, 09:47
xoma
Доброго и не задымленного всем дня!

Что-то поломалась у меня отдача картинок.

Есть вот такой код отправки фотографии пользователю:

Код: Выделить всё

Yii::app()->request->sendFile(basename($foto->file),file_get_contents($foto->file));
 
Файл скачивается нормально, размер полученного фала тоже нормальный.

Однако при попытке открыть его "просмоторщиком" изображений (дефолтный в Убунту) получаю вот что:

"Произошла ошибка интерпретации файла изображения формата JPEG (Not a JPEG file: starts with 0x0d 0x0a)".

Если сохранить этот же файл средствами браузера ("сохранить изображение") - файл открывается нормально.

md5sum обоих файлов совпадает, однако файл, полученный через sendFile не открывается ни в одном редакторе/просмоторщике.

Может кто сталкивался?

Yii из SVN, Ubuntu 10.4, Apache

Re: Отдача картинки

Добавлено: 2010.08.06, 09:58
timlar
Может это проблема не в файле, а что-то с вьювером? Если можно, прикрепи файл к посту, попробую у себя открыть. У меня Ubuntu 10.04.

Re: Отдача картинки

Добавлено: 2010.08.06, 10:25
xoma
При попытке приложить файл - движок этого форума говорит "Не удалось определить размеры изображения." =(

Re: Отдача картинки

Добавлено: 2010.08.06, 10:35
timlar
Дык в архивчик его )))

Re: Отдача картинки

Добавлено: 2010.08.06, 10:47
xoma
Опередил! Сорри, туплю!

Во вложении архив - там два файла, оба не открываются

Re: Отдача картинки

Добавлено: 2010.08.06, 11:12
timlar
По идее, если забирать изображение с помощью file_get_contents(), то оно отображаться не должно, т.к. функция file_get_contents() возвращает содержимое файла в виде строки. Как вариант, можно обработать с помощью функции imagecreatefromstring() библиотеки GD, а дальше отдать на скачивание. Еще как вариант, попробуй читать файл с помощью fread().

Код: Выделить всё

header ("Content-type: image/jpg");
$im = imagecreatefromstring(file_get_contents($file));
imagejpeg($im); 

Re: Отдача картинки

Добавлено: 2010.08.06, 11:14
timlar
Кстати, попробуй еще явно указывать тип файла в заголовке перед отдачей:

Код: Выделить всё

header('Content-type: image/jpeg');
echo file_get_contents('/img/folder/test.jpg'); 

Re: Отдача картинки

Добавлено: 2010.08.06, 11:47
slavcodev
и так тоже попробуй

Код: Выделить всё

Yii::app()->request->sendFile(basename($foto->file),file_get_contents($foto->file),'image/jpeg'); 

Re: Отдача картинки

Добавлено: 2010.08.06, 11:51
xoma
mc-bear писал(а):и так тоже попробуй

Код: Выделить всё

Yii::app()->request->sendFile(basename($foto->file),file_get_contents($foto->file),'image/jpeg'); 
Не помогает...

Re: Отдача картинки

Добавлено: 2010.08.06, 12:14
slavcodev
кто-то добавляет в файл лишний перенос строки в начале, может из-за этого
file_get_contents() is the preferred way to read the contents of a file into a string. It will use memory mapping techniques if supported by your OS to enhance performance.
а может и нет
попробуй

Код: Выделить всё

Yii::app()->request->sendFile(basename($foto->file),implode('',file($foto->file))); 

Re: Отдача картинки

Добавлено: 2010.08.06, 12:21
xoma
mc-bear писал(а):кто-то добавляет в файл лишний перенос строки в начале, может из-за этого
file_get_contents() is the preferred way to read the contents of a file into a string. It will use memory mapping techniques if supported by your OS to enhance performance.
а может и нет
попробуй

Код: Выделить всё

Yii::app()->request->sendFile(basename($foto->file),implode('',file($foto->file))); 
Тот же результат.... Может кто-нибудь воспроизвести это на Убунте и Windows ?

Re: Отдача картинки

Добавлено: 2010.08.06, 12:38
timlar
xoma писал(а):Тот же результат.... Может кто-нибудь воспроизвести это на Убунте и Windows ?
Могу на Убунте, но только вечерком... Сейчас текучки много :(

Re: Отдача картинки

Добавлено: 2010.08.06, 12:55
slavcodev
windows7, полет успешный

Код: Выделить всё

function actionTest()
{
    $file='D:/Users/User/Desktop/55.png';
    Yii::app()->request->sendFile('new'.basename($file),file_get_contents($file));
} 

Re: Отдача картинки

Добавлено: 2010.08.06, 16:55
xoma
В Убунту 10.04

Код: Выделить всё

Yii::app()->request->sendFile('IMG_5814.jpg','/home/xoma/IMG_5814.jpg');
exit;
 
После этого файл не читается.

Re: Отдача картинки

Добавлено: 2010.08.06, 17:24
timlar

Код: Выделить всё

Yii::app()->request->sendFile('wp.jpg',file_get_contents('/home/timlar/wp.jpg'),null,true); 
Все прекрасно работает.
$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 10.04.1 LTS
Release: 10.04
Codename: lucid

$ uname -a
Linux Timlar 2.6.32-24-generic #38-Ubuntu SMP Mon Jul 5 09:22:14 UTC 2010 i686 GNU/Linux

$ apache2 -v
Server version: Apache/2.2.14 (Ubuntu)
Server built: Apr 13 2010 19:28:27

$ php -v
PHP 5.3.2-1ubuntu4.2 with Suhosin-Patch (cli) (built: May 13 2010 20:01:00)

Re: Отдача картинки

Добавлено: 2010.08.06, 17:57
xoma
Рыдаю и плачу!

Контроллер, который отдавал файл, наследовался от базового контроллера админки, тот в свою очередь от контроллера приложения...

Так вот в этом контроллере приложения были пресловутые перевыды строки после закрывающей ?>, ктороые и ломали файл.

Всем спасибо!

Re: Отдача картинки

Добавлено: 2010.08.06, 18:24
timlar
Хех :) А зачем закрывать ?> ? :) Я лично не закрываю, да и в фреймворке вроде бы не закрыто нигде.

Re: Отдача картинки

Добавлено: 2010.08.06, 18:56
xoma
угу, я тоже стараюсь...но привычка, блин =(

Re: Отдача картинки

Добавлено: 2011.01.24, 15:37
zibert02
это новая фича не закрывать ?>
во всех скриптах или токо в yii?

Re: Отдача картинки

Добавлено: 2011.01.24, 15:42
Ekstazi
Это фича пхп.