Как обслуживать файлы для скачивания? Попытка предоставить файлы пользователям для просмотра / загрузки, но сервер отвечает неверным Content-Type - PullRequest
1 голос
/ 24 ноября 2010

У меня есть функционал на веб-сайте, на котором пользователь входит в систему, а затем отображается список файлов, доступных для загрузки.Когда он щелкает файл, он должен показать диалоговое окно загрузки с параметрами, которые можно открыть в приложении, если оно установлено для типа файла (например, Acrobat Reader, если он установлен), или запросить загрузку, если это не так.В настоящее время я строю список, используя PHP, просто повторяя путь каждого файла.Затем, когда пользователь нажимает на ссылку, браузер напрямую запрашивает файл.Моя первая проблема с этим состояла в том, что файлы ppsx или pptx отображались в браузере как текстовые файлы, что приводило к появлению мусора на экране.Затем я добавил файл .htaccess в каталог, где хранятся файлы, с таким содержимым:

Options All -Indexes

Header set Content-Disposition attachment

С этим файлом .htaccess открывается диалоговое окно браузера, но, например, в Firefox оноимеет параметр «Открыть с помощью: Блокнот» вместо правильного приложения для файла или ничего, если приложение не установлено для этого типа файла.Я вижу, что заголовок ответа Content-Type является «text / plain», и это неправильно, но как я могу сделать так, чтобы сервер обнаружил правильный Content-Type?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2010

Хорошо, я сдался и переписал, как это работает.В моих представлениях я печатаю путь к методу контроллера и передаю ему параметр с идентификатором файла.Контроллер проверяет идентификатор пользователя в сеансе, ищет файл в базе данных и затем получает следующий код:

if (file_exists($file['path'])) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.$file['name']);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file['path']));
    ob_clean();
    flush();
    readfile($file['path']);
    exit;
}

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

0 голосов
/ 24 ноября 2010

Необходимо использовать правильный MIME Content-Type , чтобы получить соответствующий ответ от браузера для определенного типа файла.

Powerpoint:

application/vnd.ms-powerpoint

Вы можете изменить файл .htaccess для обновленных типов MIME, как показано на этом сайте .

...