Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скачивание изображения пользователем
Форумы портала PHP.SU » PHP » Программирование на PHP » Скачивание изображения пользователем

Страниц (1): [1]
 

1. Roler - 03 Августа, 2009 - 17:09:06 - перейти к сообщению
Задача: отдать изображение пользователю с помощью диалога "Сохранить как".
Найденное решение:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. header("Content-Disposition: attachment; filename=file.dat");
  4. header("Content-Type: application/x-force-download; name=\"file.dat\"");
  5. ?>
  6.  


Сделал так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3.         header("Content-Disposition: attachment; filename=\"".$result['photo_image'].".".$result['photo_ext']."\"");
  4.         header("Content-Type: application/x-force-download; name\"".$result['photo_image'].".".$result['photo_ext']."\"");
  5.         $path = 'uploads/gallery/'.$result['photo_image'].".".$result['photo_ext'];
  6.         $x = fread(fopen($path, "rb"), filesize($path));
  7.     echo $x;
  8. ?>
  9.  


Но есть проблема - в изображение прописывается код страницы, хотя буфер очищаю. Нельзя ли как-нибудь сделать это, и обойтись без создания отдельного скрипта?
2. Мелкий - 03 Августа, 2009 - 18:03:59 - перейти к сообщению
Т.е. хотите отдавать файл по запросу пользователя тем же скритом, что и страницу отдаёт?
Тогда с помощью условия разграничьте вывод текста от файла
3. Roler - 03 Августа, 2009 - 18:08:03 - перейти к сообщению
Мелкий
Условием там проблематично, но у меня весь вывод буферизуется, пытался схитрить, но не получается. Пусть бы даже открывалось отдельным белым окном, без разницы, но через тот же скрипт.
4. Мелкий - 03 Августа, 2009 - 20:00:21 - перейти к сообщению
А почему проблематично условие вставить? Всё равно же скрипту надо указывать явно, когду ему нужно отдавать картинку, а не текст.
С буферизацией вывод не работал пока...
5. Roler - 03 Августа, 2009 - 20:22:15 - перейти к сообщению
У меня по сути один скрипт - index.php, в котором всё и инклудится. И до модуля куча всего выводится.
6. JustUserR - 03 Августа, 2009 - 21:58:13 - перейти к сообщению
Roler Ну вставьте ДО включения модуля... На худой конец вы можете в самом начала index.php вставить условие выдачи картинки и exit в конце выполения условия
И кстати к слову сказать вы можете заметить что ваша любимая буферизация это не полезно а вредно ибо у вас не структуирован код как надо раз целая проблема добавить условие Улыбка
7. Roler - 04 Августа, 2009 - 08:33:37 - перейти к сообщению
JustUserR
Это не из-за буферизации, а из-за структуры движка. И она мне нравится, добавлять это непонятное условие ради одного модуля - бр... Улыбка
8. Roler - 05 Августа, 2009 - 09:37:29 - перейти к сообщению
Так, ну что-то я вроде сделал, на локали скачивается и работает. Но, когда я поставил это на сайте, то заметил, что скачивается какая-то недокартинка весом примерно в 35 кило, и её либо нельзя открыть, либо там половины(или даже всей) нету.
Код:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. $filename = $_GET['file'];
  4. $path = $_GET['path'];
  5.  
  6. header("Content-Disposition: attachment; filename=\"".$filename."\"");
  7. header("Content-Type: application/x-force-download; name=\"".$filename."\"");
  8. $path = $path.$filename;
  9.  
  10. readfile("../".$path); // Да, путь именно такой. С путём к файлу вообще проблем нет.
  11. echo $image;
  12. ?>
  13.  
9. Мелкий - 05 Августа, 2009 - 11:34:32 - перейти к сообщению
А что вы пытаетесь вывести:

На мой взгляд - неинициализированную переменную.

и добавьте проверку перед чтением readfile
PHP:
скопировать код в буфер обмена
10. Roler - 05 Августа, 2009 - 11:40:55 - перейти к сообщению
Мелкий
Случайно от старого осталось. Спасибо за замечание о проверке, добавил. Но всё равно не работает.
Что самое интересное, когда я попробовал скачать это не со страницы, а по прямой ссылке - всё сработало.

Вообщем, повозился, подвигал - вроде заработало и на сервере. Хотя, я всё равно ничего не понимаю.
11. JustUserR - 05 Августа, 2009 - 14:34:41 - перейти к сообщению
Roler Наверное дело в том что все функции ввода/вывода могут работаь и в текстовм и в двоичном режиме (Картинкам нужен разумеется двоичный)
В Perlе есть специальная функция binmode() а в PHP уже не знаю Улыбка
12. Champion - 05 Августа, 2009 - 14:40:01 - перейти к сообщению
JustUserR пишет:
В Perlе есть специальная функция binmode() а в PHP уже не знаю
Сделайте кто-нибудь раздел про perl и отдайте его на растерзание JustUsery
13. Roler - 05 Августа, 2009 - 16:54:02 - перейти к сообщению
JustUserR
Я файл открываю с ключом rb, то есть бинарный Улыбка
Дело в чём-то другом было.

Champion
Не надо, хоть здесь их нет Радость
14. JustUserR - 06 Августа, 2009 - 14:04:34 - перейти к сообщению
Цитата:
Я файл открываю с ключом rb, то есть бинарный
Дело в чём-то другом было.
А причем здесь открывание файла
Уж раз зашел разговор то я скажу - в Perlе функция binmode по умолчанию вовсе не меняет режим открытия файла (Хотя может менять если настроить) а меняет ПОТОК ВЫВОДА то есть проводя аналогию с PHP эта функция бы немного изменила работу оператора echo - я даже уверен что в закромах PHP такая функция имеется Улыбка
По существу проблема происходит изза следующего - как бы вы не открывали файл echo все равно выводит в текстовом режиме а по какимто внутренним причинам при выводе далеко не всех а только некоторых изображений выводится только обрезанный кусок несколько килобайт
Опять попрошу меня не ругать (Плизз Улыбка но проведите эксперимент если хотите - напите простенький скрипт на Perl который выводит одну из тех картинок которая у вас выводилась с ошибкой и попробкйте вывести с binmode и без binmode и как говорится feel the difference
PS Этот эеефект с катинками проявляется толлько в определенным картинках и при определеныхт настройках Apache но binmode решает эту проблему на корню

Champion пишет:
Сделайте кто-нибудь раздел про perl и отдайте его на растерзание JustUsery
Да такие разговоры велись - если повезет то такой раздел когданибудь появится
Roler А вы что имеете против? Подмигивание

 

Powered by ExBB FM 1.0 RC1