1

私は、Apache と PHP を実行している Web サーバーにファイルをアップロードできる Adob​​e AIR アプリケーションに取り組んでいます。複数のファイルを同時にアップロードすることができ、アプリケーションはさまざまな API 要求に対して Web サーバーも呼び出します。

私が抱えている問題は、2 つのファイルのアップロードを開始すると、進行中に他の HTTP 要求がタイムアウトになり、アプリケーションとユーザーの観点から問題が発生することです。

Adobe AIR アプリケーションは 2 つの HTTP 接続に制限されていますか、それとも何か他の問題が考えられますか? この問題について検索してもあまり見つかりませんでしたが、1 つの記事で、2 つの接続だけに限定されていないことが示されました。

ファイルのアップロードは File クラスのアップロード メソッドを呼び出して実行され、API 呼び出しは HTTPService クラスを使用して実行されます。私が使用している開発 Web サーバーは WAMP サーバーですが、アプリケーションがリリースされると、LAMP サーバーと通信します。

ありがとう、グラント

ファイルをアップロードするために使用しているコードは次のとおりです。

protected function btnAddFile_clickHandler(event:MouseEvent):void
{
    // Create a new File object and display the browse file dialog
    var uploadFile:File = new File();
    uploadFile.browseForOpen("Select File to Upload");
    uploadFile.addEventListener(Event.SELECT, uploadFile_SelectedHandler);
}

private function uploadFile_SelectedHandler(event:Event):void
{
    // Get the File object which was used to select the file
    var uploadFile:File = event.target as File;
    uploadFile.addEventListener(ProgressEvent.PROGRESS, file_progressHandler);
    uploadFile.addEventListener(IOErrorEvent.IO_ERROR, file_ioErrorHandler);
    uploadFile.addEventListener(Event.COMPLETE, file_completeHandler);

    // Create the request URL based on the download URL
    var requestURL:URLRequest = new URLRequest(AppEnvironment.instance.serverHostname + "upload.php");
    requestURL.method = URLRequestMethod.POST;

    // Set the post parameters
    var params:URLVariables = new URLVariables(); 
    params.name = "filename.ext";
    requestURL.data = params;

    // Start uploading the file to the server
    uploadFile.upload(requestURL, "file");
}

API 呼び出しのコードは次のとおりです。

private function sendHTTPPost(apiFile:String, postParams:Object, resultCallback:Function, initialCallerResultCallback:Function):void
{
    var httpService:mx.rpc.http.HTTPService = new mx.rpc.http.HTTPService();
    httpService.url = AppEnvironment.instance.serverHostname + apiFile;
    httpService.method = "POST";
    httpService.requestTimeout = 10;
    httpService.resultFormat = HTTPService.RESULT_FORMAT_TEXT;
    httpService.addEventListener("result", resultCallback);
    httpService.addEventListener("fault", httpFault);
    var token:AsyncToken = httpService.send(postParams);

    // Add the initial caller's result callback function to the token
    token.initialCallerResultCallback = initialCallerResultCallback;
}
4

3 に答える 3

2

Windowsシステムを使用している場合、AdobeAIRはMicrosoftのWinINetライブラリを使用してWebにアクセスしています。このライブラリは、デフォルトで、単一サーバーへの同時接続の数を2に制限します。

WinInetは、単一のHTTPサーバーに対して行う同時接続の数を制限します。この制限を超えると、現在の接続の1つが完了するまで要求がブロックされます。これは仕様によるものであり、HTTP仕様および業界標準と一致しています。

...単一のHTTP1.1サーバーへの接続は、2つの同時接続に制限されています

この制限の値を変更するAPIがありますが、AIRからアクセスできるかどうかはわかりません。

この制限はWebサイトのページ読み込み速度にも影響するため、一部のサイトでは、画像、JavaScript、スタイルシートなどのアーティファクトに複数のDNS名を使用して、ブラウザーがより多くの並列接続を開くことができるようにしています。

したがって、サーバー部分を制御している場合、回避策はwww.example.com、アップロードやapi.example.comAPIリクエストなどのDNSエイリアスを作成することです。

于 2011-10-06T15:47:50.993 に答える
0

これを調べていると、ドキュメントで File.upload() の使用に関する次の情報に出くわしました。

リモート サーバーへのファイルのアップロードを開始します。Flash Player にはアップロードまたはダウンロードできるファイルのサイズに制限はありませんが、プレーヤーは最大 100 MB のアップロードまたはダウンロードを公式にサポートしています。このメソッドを呼び出す前に、FileReference.browse() または FileReferenceList.browse() メソッドを呼び出す必要があります。

リスナーは、アップロードの進行状況、成功、または失敗を示すイベントを受け取ります。FileReferenceList オブジェクトを使用して、ユーザーがアップロードする複数のファイルを選択できるようにすることもできますが、ファイルを 1 つずつアップロードする必要があります。そのためには、FileReference オブジェクトの FileReferenceList.fileList 配列を反復処理します。

FileReference.upload() および FileReference.download() 関数はノンブロッキングです。これらの関数は、呼び出された後、ファイル転送が完了する前に戻ります。さらに、FileReference オブジェクトがスコープ外に出た場合、そのオブジェクトでまだ完了していないアップロードまたはダウンロードは、スコープを離れると取り消されます。アップロードまたはダウンロードが続行されることが予想される限り、FileReference オブジェクトがスコープ内にあることを確認してください。

複数のファイルをアップロードする際に問題が発生する可能性があるのではないかと思います。browser() の代わりに browserForOpen() を使用しているようです。おそらく同じことをしているように思えますが、そうではないかもしれません。

Fileクラスのドキュメントでもこれを見ました

Flash Player に新しい機能が追加されたため、Flash Player 10 にパブリッシュする場合、一度にアクティブにできる操作は、FileReference.browse()、FileReference.upload()、FileReference.download() のうち 1 つだけであることに注意してください。 、FileReference.load()、FileReference.save()。それ以外の場合、Flash Player はランタイム エラー (コード 2174) をスローします。FileReference.cancel() を使用して、進行中の操作を停止します。この制限は、Flash Player 10 にのみ適用されます。以前のバージョンの Flash Player は、同時複数操作に関するこの制限の影響を受けません。

ユーザーが複数のファイルをアップロードできるようにするとは、browse() と upload() への後続の呼び出しを意味するのでしょうか、それとも複数のファイルを含む 1 つの呼び出しを意味するのでしょうか? 複数の個別の呼び出しを実行しようとしている場合、それが問題になる可能性があるようです。

とにかく、これが大きな助けになるかどうかはわかりません。あなたがやろうとしていることは間違いなく可能であるようです。うまくいかないのは、おそらく実装の問題だとしか思えません。幸運を :)

参照: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#upload()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#browse()

于 2011-10-04T18:48:44.037 に答える