1

これはあまりにも長い間私を失望させてきました..

以下に掲載されているのは、Rails 3 コントローラーです。

  1. 初めて Internet Explorer でアクセスしようとすると、ダウンロード プロンプトが失敗し、「ダウンロードできません」というメッセージが表示されます。

  2. 直後に同じ URL にアクセスしようとすると、ダウンロード プロンプトが正常に機能します。

  3. いずれにせよ、Cache-Control ヘッダーも適切に送信されていません。Rack Response に特定の値を提供していますが、Cache-Control は常に「Cache-Control: no-cache」として返されます。ただし、提供された他のヘッダー値は正しく送信されています。これは別の質問かもしれませんが、とにかく私を怒らせます。

以下のサンプルは、実際のシステムがクライアント データをどのように処理するかを模したものです。CSV が開始され、クライアントにストリーミングされます。CSV 生成が完了するまでの長い待ち時間を避けるために、ダウンロードはプログレッシブです。これらのファイルは 20 ~ 30 MB 以上になる可能性があるため、ダウンロードが開始されるまで数分待つことは望ましくありません。

これは、他のすべてのブラウザー (firefox、safari など) で機能しているようです。

class StreamingController < ApplicationController

  def index
    respond_to do |wants|
      wants.csv {
        filename = "testing_filename#{DateTime.now}.csv"

        headers.merge!({
          'Cache-Control'             => 'must-revalidate, post-check=0, pre-check=0',
          'Content-Type'              => 'text/csv',
          'Content-Disposition'       => "attachment; filename=\"#{filename}\"",
          'Content-Transfer-Encoding' => 'binary'
        })

        responder = Rack::Response.new([], 200, headers) do |response|
          response.finish do |r|
            100000.times do |t|
              r.write(t)
            end
          end
        end

        self.response_body = responder
      }
    end
  end
end
4

1 に答える 1

2

この問題はhttp://support.microsoft.com/kb/316431に関連している可能性があります- ヘッダー "Cache-Control" の "must-validate" を省略して、機能するかどうかを確認してください。そうでない場合は、ヘッダーを完全に省略してみてください。一緒に送信される「キャッシュなし」部分について、リクエストはこれを追加しているプロキシを通過する可能性がありますか?

スヴェン

于 2010-10-18T16:51:56.190 に答える