2012-05-16 19 views
33

私は現在、リンクにアクセスしてモバイルデバイスからメディアコンテンツ(ビデオ、オーディオ、写真など)をダウンロードできるPHPスクリプトを作成しています。 (すなわち、http://www.my-web-site.com/download.php?id=7ejs8ap) 私のスクリプトは、最近の携帯電話(Samsung Galaxy S、iPhone 4S、その他のもの)でテストしていたときに非常にうまくいきましたが、古いモバイルSamsung C3050でエラーが発生しました。私がダウンロードしたかったメディアは、通常は簡単にダウンロードできるオーディオmp3ファイルでした。モバイル用のHTTPヘッダ "Content-Type:application/force-download"のユーティリティ?

エラーは、「不明なコンテンツの種類」と表示されます。 私の唯一のHTTPヘッダーContent-Typeは "application/force-download"だったので、これをコメントしてやり直してみます。その後、それは動作します。 しかし、現在、私は現在、このContent-Typeが何を意味しているのか、それが他人のモバイルにとって必須であるのかを尋ねています。 iPhone 4でContent-Typeなしでテストしたところ、すべてのモバイルでこの互換性がわかりません。

Content-Typeがどのように動作するのか、誰かが私に説明してくれるのですか?これは標準MIMEではない、あるいはこれがオプションであることを確認するのに役立つその他のものです。または私がダウンロードしているデバイス?

ありがとうございました。ここで

は私の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); 
?> 

は編集:私はちょうどソニーのXperiaと試みたが、ダウンロードが成功しませんでした:私は私のファイルの「HTMLエンコードされた」バイトIを参照してくださいダウンロードしたい application/octet-streamまたはapplication/force-downloadが動作しない場合、どのようなコンテンツタイプを使用する必要があるのか​​をどのように知ることができますか?

答えて

101

Content-Type: application/force-downloadは「I、ウェブサーバは、何これについてあなたにうそをつく(ブラウザ)つもりです意味:それは、このリンクを参照してくださいMIMEタイプについて知っているすべてのMIMEタイプ

$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); 

をサポートしていますあなたがPDF/Word文書/ MP3 /何としてもそれを扱わず、不思議なファイルを代わりにディスクに保存するようユーザーに促すようなものです」クライアントが「ディスクに保存」しないときにひどく壊れてしまう汚いハックです。

使用しているメディアに応じて正しいMIMEタイプを使用してください(例:audio/mpeg、mp3)。

デフォルトの動作ではなく、クライアントにダウンロードを促す場合は、Content-Disposition: attachment; etc etcヘッダーを使用してください。

+0

ご説明いただきありがとうございます。後でアプリケーション/オクテットストリームを試してみましょう。それがうまくいかない場合は、ファイル名からMIMEタイプを検出する関数を使用します。私はこれが特別なiPhone着メロのための* .m4rまたは* .dmのようないくつかの "特別な"ファイルのためにうまくいくことを願っています... もしそうでなければ、私は自分自身の不要なスイッチ/ケースを行います。 '( – niconoe

+0

@nioconoe PHPの場合はhttp://www.php.net/manual/en/function.finfo-file.phpです。また、ファイルのMIMEタイプを知る最も簡単な方法はfileinfoライブラリです。コマンドラインから--mime ' –

+0

何コンテンツ自体は、HTMLページです(例えば、HTMLレポート)の場合 – D34dman

12

ファイルをダウンロードするには、次のコードを使用してください。ファイル名を$ file変数に保存してください。 http://php.net/manual/en/function.mime-content-type.php

+0

この関数は推奨されていませんが、MIMEタイプに関する説明を読むことができます。ありがとうございます。 しかし、アプリケーション/強制ダウンロードがすべてのブラウザで認識されたコンテンツタイプでない理由を私には説明していません。 – niconoe

+8

コンテンツ記述はHTTPに存在しません。コンテンツ転送 - エンコーディングはHTTPには存在しません。 (http://www.iana.org/assignments/message-headers/perm-headers.htmlを参照)。すべてのキャッシュ関連のヘッダーはおそらく役に立たないでしょう。最後に、$ fileの多くの値に対してContent-Dispositionヘッダーが無効になります。 RFC 6266を参照してください。 –

+0

Suresh、mime_content_type関数は非推奨となりました。 – catfood

4

application/force-downloadは標準MIMEタイプではありません。これはかなり最近に追加されたいくつかのブラウザでサポートされているハックです。

あなたの質問は本当に意味をなさない。 Internet Explorer 4が最新のCSS 3機能をサポートしていない理由を尋ねるようなものです。

+0

標準のMIMEタイプではありませんが、最近追加されたことはわかりませんでした。私はあなたが私の質問が意味をなさないと言っていますが、なぜ、私はこの "コンテンツタイプのハック"なしで私のSony Xperiaを試しても、もう動作しません。 これは、標準での作業を嫌う私たちのブラウザに使用されるようです... – niconoe

+4

標準ではないコンテンツタイプを使用する場合、定義は定義されていないためです。ブラウザが行うことは技術的に「正しい」ものです。コンテンツタイプを "application/sadjkfhlaksdjdkfjgh"に簡単に設定して、まったく同じ効果を達成できます。 –

関連する問題