任意のファイル名でダウンロードさせる
- [www]
たとえば、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
%>

ちなみに、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
コメント