Правильный header для загрузки файла

Panchous

Павел
Правильный header для загрузки файла

при загрузки файла юзером посылаю заголовок:
PHP:
header('Content-Disposition: attachment; filename="test.doc.gz"');
Но на клиенте появляется диалог с предложением сохранить "test[1].doc.gz" (IE)
В FireFox'e все нормально, а опера вообще предлагает: "test.doc.html"

Естественное желание, чтобы во всех браузерах имя файла было одинаковым.
В чем моя ошибка? Можно это как-то поправить?
Спасибо!
 

Кром

Новичок
Надо писать так:
header('Content-Disposition: attachment; filename=test.doc.gz');

Тогда нормально сохраняет везде, кроме IE.
Самый правильный вариант решение проблемы, передавать имя файла в ссылке, тогда IE будет тоже правильно обрабатывать.
 

Panchous

Павел
передавать имя файла в ссылке
это как?

у меня скрипт download.php принимает несколько ID, по которым добирается до инфы о нужно файле.
затем посылает хедеры и отдает юзеру файл.
 

Кром

Новичок
С помощью mod_rewrite, например, делать реальные ссылки на файлы, но отдавать их скриптом.
 

Кром

Новичок
>а в Опере всеравно последний ".*" заменяет на ".html"

Возможно, старая версия. В 7.54 все нормально.
Еще желательно добавить заголовок:
header("Content-Type: application/force-download");

>А другие варианты есть?

Можешь все точки в имени файла, кроме последней, заменять на подчеркивание. :)
 

Panchous

Павел
Кром
Спасибо!
заменять на подчеркивание
:)

Исходный файл: test.doc
после сжатия gz даю новое имя: test.doc.gz

если дать имя test.gz - то архиватор видит внутри архива test,
а если обозвать test.doc.gz - в архиве лежит test.doc.

-~{}~ 21.03.05 12:59:

Еще желательно добавить заголовок:
header("Content-Type: application/force-download");
Это для Оперы или вообще?

...и (если не сложно) подскажи, какие заголовки нужно отправлять для загрузки (я много вариантов видел на форуме).
Пока посылаю эти:
PHP:
header('Cache-Control: no-cache, must-revalidate'); 
header("Content-Type: application/force-download");
header('Pragma: no-cache');
header("Content-Disposition: attachment; filename=".$filename);
-~{}~ 21.03.05 13:01:

Спасибо!

header("Content-Type: application/force-download");

решил проблему с Оперой (7.53)
 

Кром

Новичок
Еще есть вариант, не отдавать файл скриптом, а писать его в какую нибудь директрорию и делать редирект на этот файл. Потом стирать его через некоторое время.

Но лучше mod_rewrite. Удобно и правильно.

-~{}~ 21.03.05 12:04:

>Пока посылаю эти:

Еще посылай Content-Length.

-~{}~ 21.03.05 12:07:

>Это для Оперы или вообще?

Вообще.
 

Panchous

Павел
Но лучше mod_rewrite. Удобно и правильно.
Согласен. А это сложно замутить?
У меня intranet-сервис на Win2003Server/Apache2/PHP5.

Еще посылай Content-Length.
Проблема в вычислении размера незжатых данных.
(Файл может закачиваться как в архиве, так и несжатый - для чего разъархивирую на лету и отдаю)

А это очень плохо, если его не посылать?
 

Кром

Новичок
>Согласен. А это сложно замутить?

Нет, совсем не сложно. Описание и примеры ищи на форуме и в сети.

>А это очень плохо, если его не посылать?

Не смертельно, но желательно.

>для чего разъархивирую на лету и отдаю

Что тебе мешает перед тем как отдать файл написать strlen($file)?
 

Panchous

Павел
Что тебе мешает перед тем как отдать файл написать strlen($file)?
Я отдаю так:
PHP:
$fp = gzopen($completeFilePath, 'r');
gzpassthru($fp);
gzclose($fp);
можно проще?

а сколько потянет strlen? Файл может весить до 20 метров.
Описание и примеры ищи на форуме и в сети.
Если несложно, дай нводку: правильные ключевые слова или линки, чтобы быстрее найти.
 

SiMM

Новичок
> а сколько потянет strlen?
Что значит потянет? Ему по барабану. Это вообще не твои проблемы.

> Если несложно, дай нводку:
Форум ИЗБРАННОЕ, ключевое слово для поиска - mod_rewrite
 

Panchous

Павел
я правильно понял с strlen:
PHP:
$fp = gzopen($filename, "r");
$gz_contents = gzread($zd, filesize($filename));
gzclose($zd);
$contents = gzuncompress($gz_contents);

// !!!!
$size = strlen($contents);
?
 

Кром

Новичок
>я правильно понял с strlen:

Если $contents, это то что ты отдаешь в output, то правильно.
 

SiMM

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

Panchous

Павел
Кром
а как тогда понять:
Код:
Warning: gzuncompress() [function.gzuncompress]: data error
при этом: size == 0 !

У меня:
PHP:
$fp = gzopen($completeFilePath, "r"); 
$gz_contents = gzread($fp, filesize($completeFilePath)); 
gzclose($fp); 
$contents = gzuncompress($gz_contents); 
$size = strlen($contents);
-~{}~ 21.03.05 13:45:

как быть?
сжимаю с помощью gzencode...
 

Кром

Новичок
>а как тогда понять:
>Warning: gzuncompress() [function.gzuncompress]: data error

Читать мануал и искать ошибку. К заголовкам это отношение не имеет.
 
Сверху