私のウェブページでは、以下のように、ダウンロード用のPDFファイルのリンクを提供しています。
<a href="myfile.pdf">Download Brochure</a>
問題は、ユーザーがこのリンクをクリックすると
しかし、Adobe Acrobatがインストールされているかどうかにかかわらず、常にダウンロードのためのポップアップを表示させたいのです。
どのようにすればいいのか教えてください。
.PDFファイルへのリンクではなく、以下のようにします。
<a href="pdf_server.php?file=pdffilename">Download my eBook</a>
これは、カスタムヘッダーを出力し、PDFを開き(バイナリセーフ)、ユーザーのブラウザにデータを印刷しますが、ユーザーはブラウザの設定に関わらずPDFの保存を選択できます。 pdf_server.phpは以下のようになります。
header("Content-Type: application/octet-stream");
$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
PS: また、ファイルの拡張子を受け付けない、スラッシュを拒否する、値に.pdfを追加するなど、ファイルが盗まれないように、"file"変数にいくつかのサニティチェックを行うことは明らかです。
Ruby on Railsアプリケーション(特にPrawn gemやPrawnto Railsプラグインなど)では、(先のPHPの例のような)完全なスクリプトではなく、もう少しシンプルにこれを実現できます。
コントローラでは
def index
respond_to do |format|
format.html # Your HTML view
format.pdf { render :layout => false }
end
end
render :layout => falseの部分は、PDFをレンダリングしようとするのではなく、ブラウザに"Would you like to download this file?"のプロンプトを開くように指示しています。そうすれば、通常通りファイルへのリンクを張ることができます。http://mysite.com/myawesomepdf.pdf