一時ファイルを作成してダウンロードさせるRubyのCGIコード

ブラウザでアクセスしたら、「ファイルを保存」のダイアログボックスを表示して、ユーザーにファイルをダウンロードさせる Ruby の CGI コードを書きました。一時ファイル用のライブラリ tempfile を使います。スクリプトを作成するディレクトリに、事前に一時ファイルを生成するためのディレクトリ(./tmp)を作成して、一時ファイルを書き込めるようにパーミッション設定。

スポンサーリンク

— 環境 —
Ruby 2.0.0

一時ファイルをダウンロードさせる Ruby コード

download_file.rb

注意点など

download_file.rb にブラウザからアクセスすると、”./tmp” ディレクトリにダウンロード保存用の一時ファイル(”./tmp/”hoge-*****.txt”)が生成され、「ファイルを保存」のダイアログボックスが表示されます。「ファイルを保存」を実行しますと、”hoge” と書き込まれたテキストファイルが “hoge-*****.txt” というファイル名でダウンロード保存されます。

ファイルをダウンロードさせるために、’Content-Type’ に “application/octet-stream” を指定。また、’Content-Disposition’ に attachment とファイル名を指定します。

また、一時ファイルを作成するための Tempfile.new メソッドの第一引数は、配列で指定するとプレフィックスとサフィックスになります。第二引数は、一時ファイルを保存するディレクトリのパス。ここでは相対パスで指定しています。詳しくはドキュメントを参照。

他に注意点として、いくつか。

1. tempfile ファイルポインタ(tf)の close を忘れないようにする。
2. tempfile 利用時は明示的に一時ファイルを削除しなくても、スクリプト終了時に一時ファイルが削除される。しかし、Rubyist Magazine によると、tempfile 利用時でも明示的に一時ファイルを削除(tf.unlink)を行うようにすべきとのことです。
3. download メソッドは、tf.close の後に呼び出す。最初、begin 節の tf.puts ‘hoge’ の直後に呼び出していたら、ダウンロードするファイルが0バイトになりました。

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!