1

別のサーバーにフォームを送信するサイトを作成しています。アップロードの進行状況の追跡には、サーバー側ではNginxHttpUploadProgressModuleを使用し、クライアント側ではjquery-upload-progressを使用します。同じサーバーにフォームを送信してセットアップをテストしましたが、すべて正常に機能しました。別のサーバーに送信しても、進行状況の追跡(クロスドメインスクリプティング)は表示されません。この問題を何時間も調査した後、JQueryによって生成されたGETリクエストに問題があるという結論に達しました。

クエリは次のようになります。

http://domain.com/upload/progress/?X-Progress-ID=39b2825934dbb2f33fe936df734ff840&callback=jsonp1249230337707&_=1249230345572

NginxHttpUploadProgressModuleサイトから:

この場所へのHTTPリクエストには、関連する追跡ゾーンへのアップロード/POSTリクエストで指定された一意の識別子を含むX-Progress-IDパラメーターまたはX-Progress-IDHTTPヘッダーのいずれかが必要です。X-Progress-IDをクエリ文字列パラメータとして使用している場合は、それがURLの最後の引数であることを確認してください。

だから、私の質問は、X-Progress-IDパラメーターをjquery GETリクエストの最後に追加する方法、またはX-Progress-IDヘッダーを設定する方法です。

これはjsonp(jquery.uploadProgress.jsからのコード)では機能しません:

beforeSend: function(xhr) {
   xhr.setRequestHeader("X-Progress-ID", options.uuid);
}

現在、リクエストは次のように生成されます(jquery.uploadProgress.jsからのコード):

jQuery.uploadProgress = function(e, options) {
 jQuery.ajax({
 type: "GET",
 url: options.progressUrl + "?X-Progress-ID=" + options.uuid,
 dataType: options.dataType,
 success: function(upload) {
 ...
4

4 に答える 4

2

GET パラメータの問題を解決しました (jquery.uploadProgress.js のコード):

jQuery.uploadProgress = function(e, options) {
  jQuery.ajax({
  type: "GET",
  url: options.progressUrl,
  dataType: options.dataType,
  data: "X-Progress-ID=" + options.uuid,
  success: function(upload) {
  ...

変更された GET リクエストは次のようになります。

http://domain.com/upload/progress/?callback=jsonp1249230337707&_=1249230345572&X-Progress-ID=39b2825934dbb2f33fe936df734ff840

nginx ウェブサーバーが正しく応答するようになりました。

ただし、Ron Evans が指摘したように、NginxHttpUploadProgressModule が変更されない限り、クライアント側の進行状況追跡部分は機能しません。

于 2009-08-03T19:30:38.937 に答える
0

問題を解決する小さな変更を加えました。ここで確認できます。

http://github.com/tizoc/nginx-upload-progress-module/commit/a40b89f63b5a767faec3c78d826443a94dc5b126

于 2009-12-11T18:22:32.013 に答える
0

アップロード ステータスのために Apache モジュールもインストールする必要があります。jQuery プラグインを使用するだけでは機能しません。

Ken に返信するには、JSONP 仕様に慣れることをお勧めします。なぜなら、JSONP はクロスドメイン Javascript 呼び出しを処理するために特別に作成されたからです。

とにかく、このコードは Passenger/Apache で、変更した Apache モジュールを使用するとうまく機能します。Nginx の拡張機能を変更しないと、JSONP 呼び出しでは機能しません。

于 2009-08-03T12:57:02.333 に答える
0

Web ページから、ページのドメインとは異なるドメインに対して XmlHttpRequest を起動することはできません。これは、すべてのブラウザーで既定のセキュリティ定義に違反しています。あなたができると私が考えることができる唯一のことは、FlashまたはSilverlightを使用してプログレスコールを開始することです(FlashとSilverlightは、crossdomain.xmlが正しく設定されている場合、ブラウザから事前設定されたドメインのリストに非同期リクエストを送信できます)または、同じドメインの制限なしで呼び出しを開始できるブラウザーアドイン (Firefox プラグイン、IE ActiveX、または組み込みの WinForm コントロールなど) をセットアップします (要求は Web ページからではなく、ブラウザー自体から発生するため)。

于 2009-08-02T21:10:41.957 に答える