【问题标题】:delete the file from the server after the download is completed下载完成后从服务器删除文件
【发布时间】:2012-01-21 18:09:01
【问题描述】:

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

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

【问题讨论】:

标签: ruby-on-rails sendfile


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能建议我apache2服务器如何知道文件下载何时完成吗?你在apache2的虚拟主机中使用过xsendfiletemporary吗
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多