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

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

4

1 回答 1

1

我已经(再次)阅读了“控制器的 Rails 指南,发送文件部分”中的部分。您选择了选项,因此您的方法立即返回,因此没有机会获得下载已完成的信息。根据网络和客户端行为,您永远不会知道文件下载是否完成。

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

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

通过该技术,根据使用情况,旧临时文件的开销将不断增加。

于 2011-12-16T06:38:58.910 回答