Страница 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
Это фича пхп.