1

ユーザーがダウンロードした後に削除する必要があるファイルサーバーがあります。でファイルを送信しますがsend_file、send_fileがすぐに返されるため、その行の後に単に置くことはできませんFile.delete(path)。そのため、ユーザーが完全なファイルを受け取る前でも、ファイルは削除されます。

これを修正するにはどうすればよいですか?これはよくある問題だと思いますが、まだ解決策が見つかりません。

これが私のコードです:

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

「コントローラーのレールガイド、ファイルの送信セクション」のセクションを(もう一度)読みました。メソッドがすぐに返されるようにオプションを選択したため、ダウンロードが完了したという情報を取得する機会はありません。ネットワークとクライアントの動作によっては、ファイルのダウンロードが完了したかどうかはわかりません。

したがって、回避策について考えることができます(実際のコードはなく、アイデアのみ)。

  • ダウンロードに必要な時間がわかっている場合は、少なくとも必要な間隔(分単位)を定義します。
  • 時間でセグメント化されたフォルダに一時ファイルを保存します。
  • 時が来たら、新しいセグメント用に新しいフォルダを作成します。
  • 時々、古いフォルダ(より古いセグメントx * delta minutes)を削除し、フォルダ全体を削除します。

この手法では、使用法に応じて、古い一時ファイルに対して一定のオーバーヘッドが発生します。

于 2011-12-16T06:38:58.910 に答える