удалить файл с сервера после завершения загрузки

У меня есть файловый сервер, который необходимо удалить после того, как пользователь загрузит его. Я отправляю файл с 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

Может ли кто-нибудь предложить мне, как удалить файл с сервера после завершения загрузки на стороне клиента?


person shonali    schedule 16.12.2011    source источник
comment
проверьте stackoverflow.com/questions/18232088/   -  person Nithin    schedule 28.11.2014


Ответы (1)


Я прочитал (еще раз) раздел в "Руководства по Rails для контроллера, раздел отправки файлов" . Вы выбрали параметры, поэтому ваш метод возвращается немедленно, поэтому нет возможности получить информацию о завершении загрузки. В зависимости от сети и поведения клиента вы никогда не узнаете, была ли загрузка файла завершена.

Таким образом, вы можете подумать об обходном пути (без реального кода, только идея):

  • Если вы знаете, сколько времени может потребоваться для загрузки, определите интервал (в минутах), который по крайней мере необходим.
  • Храните временные файлы в папках, сегментированных по времени.
  • Создавайте новые папки для новых сегментов, когда придет время.
  • Время от времени удаляйте старые папки (сегменты старше x * delta minutes) и удаляйте папку целиком.

С помощью этого метода, в зависимости от использования, у вас будут постоянные накладные расходы для старых временных файлов.

person mliebelt    schedule 16.12.2011
comment
Можете ли вы предложить мне, как сервер apache2 узнает, когда загрузка файла завершена? Вы использовали xsendfiletemporary в виртуальном хосте apache2 - person shonali; 29.12.2011