下载完成后从服务器删除该文件

时间:2011-12-16 05:59:27

标签: ruby-on-rails sendfile

我有一个文件服务器,在用户下载后必须删除。我使用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

任何人都可以建议我,如果在客户端下载完成后如何从服务器删除文件?

1 个答案:

答案 0 :(得分:1)

我已经阅读{再次} "Rails Guides for Controller, Section sending files"中的部分。您已选择了这些选项,因此您的方法会立即返回,因此无法获取下载已完成的信息。根据网络和客户端行为,您永远不会知道文件下载是否已完成。

所以你可以考虑一个解决方法(没有真正的代码,只有想法):

  • 如果您知道下载可能需要多长时间,请定义至少需要的时间间隔(以分钟为单位)。
  • 将临时文件存储在按时间分段的文件夹中。
  • 在时机成熟时为新细分创建新文件夹。
  • 不时删除旧文件夹(早于x * delta minutes的段)并删除整个文件夹。

通过这种技术,根据使用情况,您将有较长的临时文件开销。