2008-09-03 10 views
40

リンクにアクセスしたときに自動的にブラウザがローカルマシンにファイルをダウンロードさせるために、PHPに追加するコードは何ですか?PHPで自動的にダウンロードを開始するには?

私は、ソフトウェアの名前をクリックすると、ファイルをディスクに保存するようにユーザーに促すダウンロードサイトの機能に似た機能を特に考えていますか?

答えて

48

ファイル出力する前に、以下のヘッダを送信:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 

@grom: 'アプリケーション/ octet-streamの' MIMEタイプについての興味深いが。私はそれを知りませんでした。常にアプリケーション/強制ダウンロードを使用しています:)

+0

これは私には新しかったのですが、理由は分かりませんが、このスクリプトはコンテンツ長の行があれば正しく機能しました。 – sehummel

36

以下は、pdfを送り返す例です。

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($filename); 

@Swish私は(IEとFirefoxでテストした)別の何かをするためのアプリケーション/フォース・ダウンロードコンテンツの種類を見つけることができませんでした。実際のMIMEタイプを返信しない理由はありますか? PHPマニュアルHayley Watson掲載中。また

あなたが代わりにレンダリングされるので、ダウンロードして保存するファイルを強制したい場合は、「アプリケーション/力 - というようなMIMEタイプが存在しないことを覚えておいてくださいダウンロード"。この状況で使用する正しいタイプは "application/octet-stream"であり、何も使用しないのは、クライアントが認識できないMIMEタイプを無視し、代わりに "application/octet-stream"を使用することになっているということだけです。 RFC 2046の4.1.4および4.5.1を参照)。

また、IANAによれば、登録されたアプリケーション/強制ダウンロードタイプはありません。

+1

Android搭載端末のダウンロードページにアクセスすると、「ダウンロードできません」コンテンツがサポートされていません。どうして? – Emerald214

+1

@ Emerald214 PDFリーダーなし。または、PDFコンテンツタイプの関連付けがありません – grom

+0

特に、対象となるファイルタイプが.zipで、PHPでファイルをダウンロードしている場合は、 '' 'ob_clean();'上記の答えで提供されるコードの前に '' ''と '' 'ob_flush();' 'を置きます。 Windowsで.zipをネイティブに開くときに、7zipやその他の専用の圧縮アーカイブ形式処理ツールで問題なく処理できたとしても、この方法で取得した.zipアーカイブは無効であると報告されていました。 。 – SeldomNeedy

7

きれいな例です。

<?php 
    header('Content-Type: application/download'); 
    header('Content-Disposition: attachment; filename="example.txt"'); 
    header("Content-Length: " . filesize("example.txt")); 

    $fp = fopen("example.txt", "r"); 
    fpassthru($fp); 
    fclose($fp); 
?> 
+0

それはうまくいくかもしれませんが、私はそれを「きれい」と呼ぶほど遠くには行きません。 1つは、ファイル名を3回入力することです。代わりに、ファイル名を変数に設定すると、コードが冗長でなくなり、エラーの可能性が減ります。 – Mike

0

私のコードは、TXT、DOC、DOCX、PDF、PPT、PPTX、JPG、PNG、ジッパーの拡張のために働くと私はその優れた明示的に実際のMIMEタイプを使用すると思います。

$file_name = "a.txt"; 

// extracting the extension: 
$ext = substr($file_name, strpos($file_name,'.')+1); 

header('Content-disposition: attachment; filename='.$file_name); 

if(strtolower($ext) == "txt") 
{ 
    header('Content-type: text/plain'); // works for txt only 
} 
else 
{ 
    header('Content-type: application/'.$ext); // works for all extensions except txt 
} 
readfile($decrypted_file_path); 
関連する問題