2011-12-16 36 views
1

ユーザーがファイルをダウンロードした後で削除する必要があります。 send_fileでファイルを送信しますが、send_fileがimmediatlyを返すので、その行の後にFile.delete(path)を置くことはできません。そのため、ユーザーは完全なファイルを受け取る前でもファイルは削除されます。ダウンロードが完了した後にサーバーからファイルを削除します。

これを修正するにはどうすればよいですか?私はそれが一般的な問題だと思うが、まだ解決策を見つけていない。ここで

は、以下の私のコードです:

def export_rawdata 
    @device = Device.find_by_id(params[:id]) 
    @messages = @device.devmessages.all(:order => "id", :conditions => ["packettime >= ? and packettime <= ?", params[:start_time], params[:end_time]]) 
    raw_data_path = "#{Rails.root}/tmp/exports/#{@device.s_dev_name}.csv" 
    FasterCSV.open(raw_data_path, "w+") do |csv| 
    csv << ["Packet","Created At"] 
    @messages.each_with_index do |m,i| 
    x = m.created_at 
    csv << [m.message, x.strftime('%h %d, %G %r')] 
    end 
    end 

    send_file raw_data_path, :type => "text/csv", :x_sendfile => true, :streaming => false 

end 

誰でもダウンロードがクライアント側で完了すると、サーバーからファイルを削除する方法を、私を提案してくださいことはできますか?

+0

check http://stackoverflow.com/questions/18232088/in-ruby-on-rails-after-send-file-method-delete-the-file-from-server – Nithin

答えて

1

"Rails Guides for Controller, Section sending files"のセクションをもう一度読みました(もう一度)。オプションがすぐに返されるようにオプションを選択したので、ダウンロードが完了した情報を取得する機会はありません。ネットワークとクライアントの動作によっては、ファイルのダウンロードが完了したかどうかはわかりません。

だから、回避策(無実際のコード、唯一のアイデア)を考えることができます:あなたは、ダウンロードの必要があるかもしれませんどのくらい知っている場合は、

  • 少なくとも必要とされる間隔(分単位)を定義します。
  • 時間で分けられたフォルダに一時ファイルを保存します。
  • 新しいセグメントの新しいフォルダを作成してください。
  • 時々、古いフォルダ(x * delta minutesより古いセグメント)を削除し、フォルダ全体を削除します。

この手法では、使用方法によっては、古い一時ファイルに対して一定のオーバーヘッドが発生します。

+0

私はどのようにしてapache2サーバーを提案できますかファイルのダウンロードが完了したら知っていますか?あなたはapache2の仮想ホストでxsendfiletemporaryを使用しました – shonali

関連する問題