Принуждение для загрузки файла с помощью PHP

Вы не должны избегать блоков попытки/выгоды как того обычно средства, Вы правильно не обрабатываете исключения, которые могли бы произойти. Структурированная обработка исключений (SEH) является только дорогой, когда исключение на самом деле происходит, поскольку время выполнения должно обойти стек вызовов, ища обработчик выгод, выполните тот обработчик (и может быть больше чем один), затем выполнитесь наконец блоки, и затем возвратите управление назад коду в правильном местоположении.

Исключения не предназначаются, чтобы привыкнуть к логике управляющей программы, а скорее указать на состояния ошибки.

Одно из самых больших неправильных представлений об исключениях - то, что они для “exceptional условий. ”, который действительность - то, что они для передачи состояний ошибки. С точки зрения дизайна платформы нет такой вещи как “exceptional condition”. Является ли условие исключительным или не зависит от контекста использования,---, но допускающие повторное использование библиотеки редко знают, как они будут использоваться. Например, OutOfMemoryException мог бы быть исключительным для простого приложения ввода данных; it’s, не настолько исключительный для приложений, делающих их собственное управление памятью (например, SQL-сервер). Другими словами, одно man’s исключительное условие является другим man’s хроническим заболеванием. [http://blogs.msdn.com/kcwalina/archive/2008/07/17/ExceptionalError.aspx]

62
задан Peter Mortensen 28 March 2018 в 20:12
поделиться

5 ответов

.htaccess Решение

Чтобы перебрать все CSV-файлы на вашем сервере для загрузки, добавьте в свой .htaccess файл:

AddType application/octet-stream csv

Решение PHP

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile("/path/to/yourfile.csv");
104
ответ дан 24 November 2019 в 16:36
поделиться

Это невозможно сделать надежно, так как браузер должен решить, что делать с URL-адресом, который его попросили получить.

Вы можете предложить для браузеру, что он должен предлагать «сохранить на диск» сразу, отправив заголовок Content-disposition:

header("Content-disposition: attachment");

Я не уверен, насколько хорошо это поддерживается различными браузерами. Альтернативой является отправка Content-type application / octet-stream, но это взлом (вы в основном говорите браузеру: «Я не говорю вам, что это за файл», и в зависимости от того, что большинство тогда браузеры предложат диалоговое окно загрузки) и предположительно вызовет проблемы с Internet Explorer.

Подробнее об этом читайте в FAQ по веб-авторингу.

Изменить You ' Мы уже переключились на файл PHP для доставки данных, который необходим для установки заголовка Content-disposition (если нет каких-то загадочных настроек Apache, которые также могут это сделать). Теперь все, что осталось сделать, это чтобы этот PHP-файл прочитал содержимое CSV-файла и распечатал его - filename = example.csv в заголовке только подсказывает браузеру клиента, какое имя использовать для файла, на самом деле он не получает данные из файла на сервере.

15
ответ дан 24 November 2019 в 16:36
поделиться

Настройте свой сервер для отправки файла с типом носителя application / octet-stream .

8
ответ дан 24 November 2019 в 16:36
поделиться

Это означает, что ваш браузер может обрабатывать этот тип файлов.

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

2
ответ дан 24 November 2019 в 16:36
поделиться

Вот более безопасное для браузера решение:

    $fp = @fopen($yourfile, 'rb');

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
    header('Content-Type: "application/octet-stream"');
    header('Content-Disposition: attachment; filename="yourname.file"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header("Content-Transfer-Encoding: binary");
    header('Pragma: public');
    header("Content-Length: ".filesize($yourfile));
}
else
{
    header('Content-Type: "application/octet-stream"');
    header('Content-Disposition: attachment; filename="yourname.file"');
    header("Content-Transfer-Encoding: binary");
    header('Expires: 0');
    header('Pragma: no-cache');
    header("Content-Length: ".filesize($yourfile));
}

fpassthru($fp);
fclose($fp);
13
ответ дан 24 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: