- 更新日: 2014年1月27日
- Ruby
一時ファイルを作成してダウンロードさせるRubyのCGIコード
ブラウザでアクセスしたら、「ファイルを保存」のダイアログボックスを表示して、ユーザーにファイルをダウンロードさせる Ruby の CGI コードを書きました。一時ファイル用のライブラリ tempfile を使います。スクリプトを作成するディレクトリに、事前に一時ファイルを生成するためのディレクトリ(./tmp)を作成して、一時ファイルを書き込めるようにパーミッション設定。
— 環境 —
Ruby 2.0.0
一時ファイルをダウンロードさせる Ruby コード
download_file.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/usr/bin/env ruby require 'cgi' require 'tempfile' def download(filename) open(filename) do |fp| basename = File.basename(filename) param = { 'Content-Type' => "application/octet-stream", 'Content-Length' => fp.stat.size, 'Expires' => 0, 'Cache-Control' => "must-revalidate, post-check=0,pre-check=0", 'Pragma' => "private", 'Content-Disposition' => "attachment; filename=\"#{basename}\"" } cgi = CGI.new cgi.out(param) do fp.read end end rescue => e cgi = CGI.new cgi.out() { e.to_s } end tf = Tempfile.new(['hoge-', '.txt'], './tmp') begin tf.puts 'hoge' ensure tf.close download(tf.path) tf.unlink end |
注意点など
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あれこれ/ファイルダウンロード – 笑猫酒家
- Rubyist Magazine – 標準添付ライブラリ紹介 【第 15 回】 tmpdir, tempfile
- class Tempfile
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!