4

ソーシャルネットワークへのスケジュールされた投稿のWebサービスを作成しています。
トラフィックの多い状況でのファイルのアップロードの処理についてサポートが必要です。

プロセスの概要:

  • ユーザーがファイルをSomeServerにアップロードします(私のものではありません)。
  • 次に、SomeServerはJSON文字列で応答します。
  • 私のWebアプリはそのJSON応答を保存する必要があります。

オプション1:保存、cURL POST、tmp
の削除私がそれを機能させた愚かな方法:

  1. ユーザーがファイルをMyWebAppにアップロードします。
  2. MyWebApp cURLは、SomeServerのさらに先にあるファイルであり、応答を取得します。

オプション2:JSマジック
完璧なスマートな方法:

  1. ユーザーは、iFrame内からファイルをSomeServerに直接アップロードします。
  2. MyWebAppは、JavaScriptを介して応答を取得します。

しかし、これは「同一生成元ポリシー」のために不可能ですよね?

オプション3:nginxプロキシ?
本番サーバーのより良い方法:

  1. ユーザーがファイルをMyWebAppにアップロードします。
  2. nginxはファイルのアップロードをインターセプトし、SomeServerに直接送信します。
  3. JSON応答もnginxによってインターセプトされ、MyWebAppによって処理されます。

/fileuploadこれは意味がありますか?たとえば、 SomeServerにプロキシするためのLocationのnginx構成は何でしょうか?

4

2 に答える 2

1

この問題に対する主なアプローチは、サーバー側のプロキシとjavascript/クライアント側のクロスサイトアップロードの2つだけです。あなたのアプローチ13は同じものです。cURLまたはnginxのどちらを使用してファイルをPOSTするかは、パフォーマンスに関しては問題ではありません。したがって1、質問からすでにアプローチを実装している場合は、に切り替える理由はありません3

javascriptと同一生成元ポリシーに関しては、目標を達成する方法はたくさんあるようですが、これらすべての方法で、シナリオがSomeServerの開発者によってサポートされているか、SomeServerへの何らかのアクセス権が必要です。可能性の大まかなリストは次のとおりです。

SomeServerにファイルをアップロードできるので、最後のものは実際にはあなたにとって本当の可能性である可能性があります。ただし、もちろん、実装方法によって異なります。たとえば、ファイルが提供される別のドメインがある場合や、htmlファイルをホストできないセキュリティ対策がある場合は、機能しない可能性があります。

于 2012-04-18T00:47:22.787 に答える
1

提案をテストするためにSomeServerの代わりに使用するサーバーはありませんが、とにかく試してみます。私が間違っている場合は、Flash(VKのサンプルコード)を使用する必要があると思います。

iFrameを使用してファイルをSomeServerにアップロードし、JSON応答を受信して​​から、を使用postMessageしてiFrameからサイトのメインウィンドウにJSON応答を渡すのはどうでしょうか。私が理解しているように、それがpostMessageそもそも作成する動機です。

全体として、私はこのようなものまたはYUIのio()モジュールを考えていますがpostMessage、同一生成元ポリシーを回避するために追加されています。

または、VKの場合、明示的なiFrameサポートを使用します。グローバルVKオブジェクトにメソッドを追加し、を使用してVKオリジンドメインからそのメソッドを呼び出すことができるように見えますVK.callMethod()。この回避策を使用して、非表示のiFrameからの応答を読み取ることができる関数を作成できます。

したがって、VK.api('photos.getUploadServer'、...)を使用してPOSTURLを取得します。

次に、JSを使用して、ファイルのアップロードに使用するFORMのアクションとしてそのURLを挿入します。io()ドキュメントcomplete関数の「HTMLフォームでのファイルのアップロード」の例に従って、postMessageJSONを親ウィンドウにポストバックするために使用します。こちらの例とドキュメントをご覧ください。(それがうまくいかない場合、私が正しければ、あなたは確かにあなた自身のロールのサンプルコードio()を使ってそれを動かすことができます。)VK.callMethod()

次に、応答として、postMessage通常のAJAXを使用してJSON応答をサーバーにアップロードします。

于 2012-04-19T01:02:41.423 に答える