2011-12-16 121 views
1

我有一個文件服務器在用戶下載後必須刪除。我發送的文件爲send_file,但我不能只在該行後面加上File.delete(path),因爲send_file立即返回,所以即使在用戶收到完整文件之前文件也會被刪除。下載完成後從服務器上刪除文件

我該如何解決這個問題?我認爲這是一個常見問題,但還沒有找到解決方案。

這裏是我下面的代碼:

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

檢查http://stackoverflow.com/questions/18232088/in-ruby-on-rails-after-send-file-method-delete-the-file-from-server – Nithin 2014-11-28 09:49:21

回答

1

我已閱讀(再次)"Rails Guides for Controller, Section sending files"中的部分。您已經選擇了這些選項,以便您的方法立即返回,因此沒有機會獲取下載完成的信息。根據網絡和客戶端行爲,您將永遠不知道文件下載是否完成。

所以,你能想到一個解決方法(沒有真正的代碼,只有想法):這至少需要

  • 如果您知道下載多長的需要,定義的時間間隔(以分鐘爲單位)。
  • 將臨時文件存儲在按時間分段的文件夾中。
  • 當時間到了時,爲新細分創建新文件夾。
  • 不時刪除舊文件夾(段落大於x * delta minutes)並刪除整個文件夾。

通過該技術,根據使用情況,您將有一個不變的開銷爲老的臨時文件。

+0

你可以建議我如何apache2服務器知道文件下載何時完成?你有沒有在apache2的虛擬主機中使用xsendfiletemporary – shonali 2011-12-29 13:20:07