Вопрос по download, php, mobile, http, content-type – Утилита HTTP-заголовка «Content-Type: application / force-download» для мобильного?

37

В настоящее время я работаю над сценарием PHP, который позволяет загружать мультимедийное содержимое (видео, аудио, изображения ...) с вашего мобильного устройства по ссылке. (Т.е.http://www.my-web-site.com/download.php?id=7ejs8ap) My script worked very vell when I was testing it with recent mobile (Samsung Galaxy S, iPhone 4S, some others...) but an error occured on my old mobile Samsung C3050. The media I wanted to download was just an audio mp3 file that I usually download easily.

Ошибка выглядит как «Неизвестный тип содержимого». Так как мой единственный HTTP-заголовок Content-Type был «application / force-download», я пытаюсь это прокомментировать и попробуйте снова. Тогда это работает. Но сейчас я спрашиваю, что означает этот тип контента и может ли он быть обязательным для других мобильных устройств. Я тестировал без Content-Type на iPhone 4, и он работает, но я не уверен в этой совместимости для всех мобильных устройств.

Может кто-нибудь объяснить мне, как работает этот Content-Type, почему это не стандартный MIME или все остальное, что может помочь мне убедиться, что это необязательный Content-Type для каждой загрузки, независимо от того, каким файлом, браузером или устройством я являюсь загрузка на?

Спасибо всем.

Вот мои отправленные заголовки PHP:

<?php
//Assume that $filename and $filePath are correclty set.
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$filename.'"');
// header('Content-Type: application/force-download'); Non-standard MIME-Type, incompatible with Samsung C3050 for example. Let it commented
readfile($filePath);
?>

РЕДАКТИРОВАТЬ: Я только что попытался с Sony Xperia, и загрузка не удалась: я вижу только "HTML-кодированный" байт моего файла, который я хочу скачать. Как я могу узнать, какой тип контента я должен использовать, если application / octet-stream или application / force-download не работает?

Ваш Ответ

3   ответа
108

Content-Type: application/force-download означает "я, веб-сервер, собираюсь лгать вам (браузеру) о том, что это за файл, чтобы вы не рассматривали его как PDF / Word Document / MP3 / что угодно, и предлагать пользователю сохранить загадочный файл". вместо этого на диск ». Это грязный хак, который ужасно ломается, когда клиент «не сохраняет» на диск ».

Используйте правильный тип MIME для любого носителя, который вы используете (например,audio/mpeg для mp3).

ИспользоватьContent-Disposition: attachment; etc etc заголовок, если вы хотите побудить клиента загрузить его, а не следовать стандартному поведению.

@Quentin спасибо за разъяснения :) я генерировал отчет html (и гораздо лучший отчет уже отображался на экране). Так что на этой странице есть ссылка для скачивания, и я спросил себя, действительно ли пользователь должен подтвердить это перед сохранением на диск! не является ли это ненужным шагом. Так что, кажется, это грязная вещь. И я не хочу, чтобы мое приложение было помечено как лжец :). Должны быть осторожны с упрощением рабочего процесса и тому подобного.
@nioconoe Самый простой способ выяснить тип MIME для файла - это библиотека fileinfo. В PHP этоphp.net/manual/en/function.finfo-file.php, Вы также можете запуститьfile --mime <filename> из командной строки.
Спасибо за ваши объяснения. Позже я попробую application / octet-stream и, если он не работает, я буду использовать функцию для обнаружения mime-типа по имени файла. Я надеюсь, что это будет работать для некоторых "специальных" Например, у меня есть файл * .m4r или * .dm для специальных мелодий звонков iPhone ... Если нет, я сделаю свой собственный нежелательный переключатель / чехол: & apos; ( niconoe
@ D34dman & # x2014; Что если это так? Это не особый случай.
Что, если сам контент является HTML-страницей? (пример отчета в формате html)?
4

application/force-download не является стандартным типом MIME. Это взлом, поддерживаемый некоторыми браузерами, добавленный сравнительно недавно.

Ваш вопрос не имеет никакого смысла. Это все равно, что спросить, почему Internet Explorer 4 не поддерживает последние функциональные возможности CSS 3.

Я знаю, что это не стандартный тип MIME, но я не знал, что он был добавлен недавно. Я не согласен с тем, что вы говорите мне, что мой вопрос не имеет никакого смысла, но почему, когда я попробовал с моим Sony Xperia без этого "взлома типа контента", он больше не работает? Похоже, это будет использоваться для наших браузеров, которым не нравится работа со стандартными ... niconoe
14

Для загрузки файла используйте следующий код ... Сохраните имя файла с указанием местоположения в переменной $ file. Поддерживает все типы пантомимы

$file = "location of file to download"
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
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));
ob_clean();
flush();
readfile($file);

Чтобы узнать о типах Mime, пожалуйста, перейдите по этой ссылке:http://php.net/manual/en/function.mime-content-type.php

Вопрос: почему вы используете flush () и ob_clean ()
Описание содержимого не существует в HTTP. Content-Transfer-Encoding не существует в HTTP. (Увидетьiana.org/assignments/message-headers/perm-headers.html). Все связанные с кэшем заголовки, вероятно, бесполезны. Наконец, заголовок Content-Disposition будет недействительным для многих значений $ file. См. RFC 6266.
Как уже было сказано: предпочитайте использовать реальный Content-Type, а не «Content-Type: application / octet-stream».
Хотя эта функция устарела, я могу прочитать некоторые пояснения по MIME-типу, так что спасибо. Но это не объясняет, почему приложение / принудительная загрузка не является распознанным типом контента для всех браузеров ... niconoe
Суреш, функция mime_content_type теперь считается устаревшей.

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