< Server Gated Cryptography | モジュールのインストール(PPM編) >

October 28, 2003

任意のファイル名でダウンロードさせる

たとえば、ASPやCGIからCSVを動的に生成して出力するような場合です。
ためしにこんなコードを書いてみました。

<%
' sample.asp
Response.ContentType = "application/x-csv"
For i = 0 to 10
    For j = 0 to 10
        %><%=i*j%>,<%
    Next
    %>日本語フィールド<%=vbNewLine%><%
Next
%>

このaspスクリプトへのリンクを別のhtmlに貼っておき、クリックするとCSVがダウンロードされる、用にしたかったのですが、これではダウンロードされるファイル名がsample.aspになってしまいます。中身はカンマ区切りのテキストなのですが。
ここで関係してくるのがRFC2183[HTMLコーディングチェック]に定義されているContent-Dispositionヘッダです。

Content-Dispositionは、簡単に言うと、発信する側が、コンテンツの実際の場所とは別に、論理的な(表現上の)場所を定義するもの、らしいです。このヘッダの値は

disposition-type 
*(";" disposition-parm)
をとります。
disposition-type
"inline"(埋め込み)|"attachment"(添付)|その他
inlineとattachmentはブラウザの処理の違いを期待する程度、ですが、実際にはMIMEタイプによるみたいです。
disposition-parm
ファイル名、作成日、更新日、サイズ等が指定可能です。0~任意の数指定します。
今回の目的は、ファイル名を指定してダウンロードさせる、ですので、ファイル名を指定してファイルを添付してみます。

<%
' sample2.asp
Response.ContentType = "application/x-csv"
Response.AddHeader "Content-Disposition", "attachment;filename=sample.csv"

For i = 0 to 10
    For j = 0 to 10
        %><%=i*j%>,<%
    Next
    %>日本語フィールド<%=vbNewLine%><%
Next
%>
うまくいきました。ダイアログが出て、保存をクリックすると、sample.csvというファイル名の入った保存ダイアログが表示されます。
ちなみに、PerlでCGIとして同じことをするならこんな感じ。
print "Content-type: text/x-hdml;charset=Shift_JIS\n";
print "Content-Disposition: attachment;filename=sample.csv\n";
print "\n";

for ($i=0; $i<=10; $i++) {
	for ($j=0; $j<=10; $j++) {
		$_ = ($i * $j);
		print "$_,";
	}
	print "日本語フィールド\n";
}

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/89

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?