1

我正在开发一个 Adob​​e AIR 应用程序,它可以将文件上传到运行 Apache 和 PHP 的 Web 服务器。可以同时上传多个文件,并且应用程序还调用 Web 服务器以获取各种 API 请求。

我遇到的问题是,如果我开始两个文件上传,而它们正在进行中,任何其他 HTTP 请求都会超时,这会导致应用程序出现问题,并且从用户的角度来看。

Adobe AIR 应用程序是否仅限于 2 个 HTTP 连接,或者可能是其他问题?通过搜索这个问题,我没有发现太多,但一篇文章确实表明它不仅限于两个连接。

文件上传通过调用 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 系统上,Adobe AIR 正在使用Microsoft 的 WinINet 库来访问 Web。默认情况下,此库将与单个服务器的并发连接数限制为 2

WinInet 限制它与单个 HTTP 服务器建立的同时连接数。如果超过此限制,请求会阻塞,直到当前连接之一完成。这是设计使然,并且与 HTTP 规范和行业标准一致。

... 与单个 HTTP 1.1 服务器的连接仅限于两个同时连接

有一个 API 可以更改此限制的值,但我不知道它是否可以从 AIR 访问。

由于此限制也会影响网站的页面加载速度,因此一些网站使用多个 DNS 名称来处理图像、javascript 和样式表等工件,以允许浏览器打开更多并行连接。

因此,如果您正在控制服务器部分,解决方法可能是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 对象让用户选择多个文件进行上传,但您必须逐个上传文件;为此,请遍历 FileReference 对象的 FileReferenceList.fileList 数组。

FileReference.upload() 和 FileReference.download() 函数是非阻塞的。这些函数在它们被调用之后,在文件传输完成之前返回。此外,如果 FileReference 对象超出范围,则在该对象上尚未完成的任何上传或下载都会在离开范围时取消。只要上传或下载预计会继续,请确保您的 FileReference 对象保持在范围内。

我想知道上传多个文件是否会给您带来问题。我看到您使用的是 browserForOpen() 而不是 browse()。似乎可能做同样的事情......但也许不是。

我也在 File 类文档中看到了这一点

请注意,由于 Flash Player 添加了新功能,因此在发布到 Flash Player 10 时,您一次只能激活以下操作之一:FileReference.browse()、FileReference.upload()、FileReference.download() , 文件引用.load(), 文件引用.save()。否则,Flash Player 会引发运行时错误(代码 2174)。使用 FileReference.cancel() 停止正在进行的操作。此限制仅适用于 Flash Player 10。Flash Player 的早期版本不受此同时进行多项操作的限制的影响。

当您说您让用户上传多个文件时,您是指对browse() 和upload() 的后续调用还是一个包含多个文件的调用?似乎如果您尝试进行多个单独的调用,这可能是一个问题。

无论如何,我不知道这是否有很大帮助。看起来你正在尝试做的事情肯定可能的。我只能猜测出了什么问题可能是实施的问题。祝你好运 :)

参考: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 回答
0

仅仅因为我的一个实际应用程序出现错误,我正在考虑一个非常相似的问题,我决定写下我找到的答案。

我实例化了 11

HttpConnections

并且想知道为什么我的 Flex 4 应用程序停止工作并引发 HTTP 错误,尽管它以前工作得很好,只有 5 个同时连接到同一服务器的 HttpConnections。

我自己对此进行了测试,因为我在 Flex 文档或互联网上没有找到任何关于此的内容。

我发现使用超过 5 个 HTTPConnections 是 Fl​​ex 应用程序抛出运行时错误的原因。

我决定一个接一个地实例化连接作为临时解决方法:在另一个接收数据后加载下一个连接,依此类推。这当然只是暂时的,因为接下来的步骤之一将是更改响应服务器代码,使其响应包含请求结果的请求,而不是一个响应的表。当然,客户端应用程序逻辑也需要更改。

于 2016-02-04T21:04:00.423 回答