2011-12-16 120 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