0

send_file がファイルを正しく送信できないという奇妙な状況に陥っています。状況は次のとおりです。

Rail バージョン: 3.0.10 および 3.1.0 [テスト用の 2 つの異なるブランチ] Ruby: RVM 上の 1.9.2 Web サーバー: Apache with Passenger

私のクライアントは文書管理システムを持っています。Rails 2 から Rails 3 (そして現在は Rails 3.1) へのアップグレードに取り組みました。以前のシステムはかなり古いものだったので、ほとんどのシステムを再開発しました。1つを除いてすべての機能が機能しています。このアプリケーションにより、ユーザーは自分に割り当てられたドキュメントをダウンロードできます。ユーザーがログインすると、自分に割り当てられているドキュメントが表示され、ダウンロードできます。それは完全にうまく機能します。動作するコードは次のとおりです。

send_file(document.file[:path],
                    :type => document.file[:content_type],:x_sendfile=>true, :filename=>document.name)

彼ら (私のクライアント) が、.NET ベースの Web サービス (ま​​たはそれが呼ばれる可能性のあるもの) を介して要求されたときにドキュメントを送信する以前のソリューションを作成したクライアントが 1 つあります。Web サービスはユーザーとして認証され、ドキュメント ダウンロード パスに転送されます。Web サービスを認証してから、ファイルをダウンロードするコントローラー アクションにリダイレクトすることはできますが、機能しません。サーバーログには、すべて問題ないことが示されています。

Started GET "/download/12234" for 12.123.12.123 at 2011-09-20 23:21:24 -0400
  Processing by DocumentController#download as HTML
  Parameters: {"id"=>"12234"}
Sent file /yyy/zzz/abc/12234 (0.1ms)
Completed 200 OK in 138ms

特定の名前と IP を変更しました。IP (12.123.12.123) は、Web サービスをホストするサーバー用であることに注意してください。

私は .NET Web サービスを開発した開発者と電話で話しました。彼は、コンテンツの長さが -1 であり、コンテンツを受信して​​いないことを除いて、すべてのヘッダーを正しく取得していると述べています。彼は、他のすべてのヘッダーは正しいと言いました。

この問題を解決するために; 可能なすべてのオプション(x_sendfile、stream、dispositionなど)を設定して、send_fileの複数のバリエーションを試しました。また、ヘッダーを設定してみました:

response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"

しかし、Web サービスを使用してファイルをダウンロードしても何も機能しません。ただし、同じ方法はブラウザーで直接機能します [コードで認証をバイパスしてテストしました]。

send_date を使用してみましたが、うまくいきません:

File.open(document.file[:path], 'r') do |f|
send_data f.read, :type => document.file[:content_type], :filename => document.name, :disposition => 'inline'
end

回避策として、ファイルを送信する代わりにredirect_toを試し、パブリックフォルダーでテストファイルを使用しましたが、機能しました。安全ではありませんが、これはうまくいくようです。唯一の問題は、ブラウザがドキュメントをダウンロードする代わりに開いていることです。

私を助けてください。

更新:この問題は、Rails がチャンク化されたコンテンツを送信するようになり、Web サービスがコンテンツの長さを予期していたという事実に関連していました。

4

1 に答える 1

1

send_file では問題ありませんでした。それが .NET Web サービスのプログラミング方法でした。コンテンツの長さを期待していました。

コンテンツを送信するときのデフォルトの動作に (Rails 2 と Rails3 の間で) 変更があります。現在はコンテンツがチャンク化されているため、コンテンツの長さはあり得ません。

.NET 担当者がコードを変更し、すべてが正常に機能するようになりました。これが誰かを助けることを願っています。

于 2011-09-24T06:25:24.470 に答える