cfheader、cfcontentを利用したファイルダウンロードについて

サーバー上のファイルをユーザーがダウンロードする際に、アンカー(<a>)タグを使用するとブラウザ上で開いてしまうようなファイル(PDFや画像等)については、cfcontentとcfheaderとを使ってダウンロードさせる方法があります。

プログラム例(以下は、c:/temp/aaaaaa.pdfをダウンロードさせる例です)

<cfheader name="Content-Disposition" value="attachment; filename=""ダウンロードする際の日本語を含むファイル名.pdf""" />
<cfcontent type="application/octet-stream" file="c:/temp/aaaaaa.pdf" />

【ポイント】

  • cfcontentタグのtypeに「application/octet-stream」を指定しています。PDFファイルをダウンロードさせたい場合などに、application/pdfなどではなくこのtypeを指定することで、ファイル形式が不明→PDFをブラウザで開くのではなく、ダウンロードを行わせることができます(→参考情報)。
  • cfheaderタグは、ブラウザのレスポンスヘッダに情報を追加する際に用います。「attachment; filename="ファイル名"」を指定することで、ブラウザに戻されたコンテンツをダウンロードすべきである事と「名前を付けて保存」ダイアログを表示した際の最初のファイル名を指定します(→参考情報)。

cfheaderタグのvalue="attachment; filename=ファイルパス\ファイル名"指定で、ブラウザ上からダウンロード処理が可能です。 cfcontentタグのdeleteFile="yes"指定で、ダウンロード後にサーバ上に作成したエクセルファイルは削除されます。


【応用編①】サーバーのファイルではなく、ColdFusionの内部処理で生成した文字列(CSVなど)をそのままダウンロードさせたい

cfcontentでファイルをダウンロードさせる際に、ファイルではなくバイナリデータを指定してダウンロードさせる方法があります。<cfcontent file="サーバーのファイル" ... >ではなく、<cfcontent variable="バイナリデータを値にもつ変数" ...> と指定します。

ダウンロードさせたいデータが文字列(CSVなど)の場合は、そのままではcfcontentでダウンロードできないため、一旦文字列をバイナリに変換する処理が必要です。以下のプログラム例を参考にしてください。

	<cfprocessingdirective pageencoding="UTF-8" />
	<cfscript>
	  function stringToBinary( String stringValue ){
	    var base64Value = toBase64( stringValue, "MS932" );
	    var binaryValue = toBinary( base64Value );
	    return( binaryValue );
	  }
	</cfscript>

	<cfset csvFile="東京Ⅰ,千葉②,埼玉,神奈川㈱"  >
	<cfheader name="Content-Disposition" value="attachment; filename=""pref.csv""" />
	<cfcontent type="application/octet-stream" variable="#stringToBinary(csvFile)#" reset="yes"/>
   

 
上記のサンプルではユーザー定義関数(UDF:stringToBinary)を定義して、そこにCSVデータを渡しています。toBase64にエンコード「MS932(Shift_JIS)」を指定することで、対象の文字列を指定したエンコードに変換することも可能です(今回の場合は、UTF-8のCSVではなくShift_JIS(MS932)のCSVを作成してダウンロードさせています)。
※サンプルで使用している各関数については、オンラインマニュアル等でご確認ください。


【応用編②】ダウンロード時の初期ファイル名に特殊な文字が含まれていて、ブラウザで正しく表示されない場合

ダウンロード時のファイル名に特殊文字や日本語以外の文字(※ColdFusion日本語版では、日本語以外の文字の動作はサポートされていませんが)が含まれている場合、上記で紹介した方法ではブラウザで表示されない場合があります(__.pdfみたいになります)。その対応として、cfheaderによるレスポンスヘッダーに filename* で UTF-8エンコードしたファイル名を付け加えるという方法があります(→参考サイト)。
 

<cfset fileName="ブラウザでそのまま表示できないファイル名.pdf">
<cfheader name="Content-Disposition" value="attachment; filename=""#filenName#""; filename*=UTF-8''#EncodeForURL(fileName)#" />
<cfcontent type="application/octet-stream" file="c:/temp/aaaaaa.pdf" />


 


記事公開日:2024年12月27日
最終更新日:2024年12月27日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.