PDF を必ずファイルとしてダウンロードさせる

SPECIAL

Web サイトに PDF ファイルのリンクを用意して、そこから必ずダウンロードしてもらうための方法について調べてみました。


PDF ファイルを任意のフォルダーへダウンロードさせるようにする

Internet Explorer でどこかの Web サイト上の PDF ファイルを開くと、プラグインを用いてブラウザー画面上にその PDF ファイルの内容を表示しようとします。

これはこれで便利ではあるのですけれど、誰かに PDF をダウンロードしてもらいたい場合には、これだと相手がこれを保存する方法が分らずに困ってしまうこともあり、説明などの手間が余計に必要になってきたりします。

 

そこで、自動的にダウンロードさせるようにする方法はないか調べてみたところ、次のようにすることで、ファイルをダウンロードさせることができることが分りました。

HTTP でブラウザーと Web サーバーとがやりとりを行う場合、ヘッダーという情報を使用して、その詳細を相互に知らせることができるようになっています。

このヘッダーの中に、次のような内容を含めることにより、ブラウザーにこのコンテンツがダウンロードすべきものということを知らせることができるようでした。

Content-Disposition: attachment; filename="NAME.PDF"

このようにすることで、このコンテンツは "NAME.PDF" という名前の添付ファイルであることをブラウザーに告げます。

このヘッダーは PHP や ASP のようなスクリプトを用いて付加することができるので、その方法について以下に記していきたいと思います。

 

PHP でファイルをダウンロードさせる

PHP で PDF ファイルを強制的にダウンロードさせるプログラムは次のような感じです。

<?php

$Filename = 'sample.pdf';

$ContentType = 'application/pdf';

 

$TargetFile = fopen($Filename, 'rb');

 

if ($TargetFile)

{

header("Content-Type: $ContentType");

header("Content-Disposition: attachment; filename=$Filename");

 

while (!feof($TargetFile))

{

print fread($TargetFile, 1024);

}

 

fclose($TargetFile);

}

else

{

header('Status: 500 Internal Server Error');

header('Content-Type: text/plain');

 

print('Failed to open the file.');

}

?>

このような PHP ページを用意して、ダウンロードさせたいファイルと併せてサーバーへアップロードします。

このページをブラウザーで参照することで、PDF ファイルでもプラグインによる表示は行われず、ダウンロードする画面が表示されるようになります。

PHP スクリプト内の "$Filename" や "$ContentType" を調整すれば、Excel や画像など、その他のブラウザーで表示されるファイルでも、ダウンロードしてもらうことができるようになります。

  

ASP でファイルをダウンロードさせる

ASP で PDF ファイルを強制的にダウンロードさせるプログラムは次のような感じです。

<%

Const adTypeBinary = 1

 

Dim Filename

Dim ContentType

 

Dim BinStream

 

 

Filename = "sample.pdf"

ContentType = "application/pdf"

 

 

Set BinStream = Server.CreateObject("ADODB.Stream")

 

Call BinStream.Open

 

BinStream.Type = adTypeBinary

 

Call BinStream.LoadFromFile(Server.MapPath(Filename))

 

 

Response.buffer = TRUE

Response.ContentType = ContentType

 

Call Response.AddHeader("Content-Disposition", "attachment; filename=" & Filename)

Call Response.BinaryWrite(BinStream.Read)

 

Call BinStream.Close

 

Set BinStream = Nothing

 

Call Response.End

%>

このような ASP ページを用意して、ダウンロードさせたいファイルと併せてサーバーへアップロードします。

このページをブラウザーで参照することで、PDF ファイルでもプラグインによる表示は行われず、ダウンロードする画面が表示されるようになります。

ASP スクリプト内の "Filename" や "ContentType" を調整すれば、Excel や画像など、その他のブラウザーで表示されるファイルでも、ダウンロードしてもらうことができるようになります。