我有一个文件服务器,在用户下载后必须删除。我使用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 :(得分:1)
我已经阅读{再次} "Rails Guides for Controller, Section sending files"中的部分。您已选择了这些选项,因此您的方法会立即返回,因此无法获取下载已完成的信息。根据网络和客户端行为,您永远不会知道文件下载是否已完成。
所以你可以考虑一个解决方法(没有真正的代码,只有想法):
x * delta minutes
的段)并删除整个文件夹。通过这种技术,根据使用情况,您将有较长的临时文件开销。