我正在开发一个Adobe AIR应用程序,它可以将文件上传到运行Apache和PHP的web服务器。可以同时上传多个文件,并且应用程序还可以调用web服务器进行各种API请求。
我遇到的问题是,如果我开始两个文件上传,而他们正在进行任何其他HTTP请求将超时,这将导致一个问题的应用程序和从用户的角度来看。
是Adobe AIR应用程序限制为2个HTTP连接,还是其他可能的问题?通过对这个问题的搜索,我没有发现太多,但有一篇文章表明,它并不局限于两个连接。
文件上传是通过调用file类的upload方法来执行的,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;
}
如果您在windows系统上,Adobe AIR正在使用microsoft WinINet库访问web。默认情况下,此库将到单个服务器的并发连接数限制为2:
WinInet限制了它对单个HTTP服务器的同时连接数。如果超过了这个限制,请求就会阻塞,直到其中一个当前连接完成。这是经过设计的,并且符合HTTP规范和行业标准。
…到单个HTTP 1.1服务器的连接被限制为两个同时连接
有一个API来改变这个限制的值,但我不知道它是否可以从AIR访问。
由于这个限制也影响网页加载速度,一些网站使用多个DNS名称的工件,如图像,javascript和样式表,以允许浏览器打开更多的并行连接。
因此,如果你控制服务器部分,一个解决方案可以是创建DNS别名,如www.example.com
用于上传和api.example.com
用于API请求。
所以当我在寻找这个,我遇到了这个信息关于使用File.upload()在文档:
开始将文件上传到远程服务器。虽然Flash Player对你可以上传或下载的文件大小没有限制,但播放器官方支持上传或下载高达100 MB。在调用此方法之前,您必须调用FileReference.browse()或FileReferenceList.browse()方法。
侦听器接收事件以指示上传的进度、成功或失败。虽然你可以使用FileReferenceList对象让用户选择多个文件进行上传,但你必须一个一个地上传文件;为此,迭代FileReferenceList。filerreference对象的fileList数组。
FileReference.upload()和FileReference.download()函数是非阻塞。这些函数在被调用之后返回文件传输完成。另外,如果filerreference对象超出作用域,任何尚未超出作用域的上载或下载该对象上的Completed在离开作用域时被取消。一定你的filerreference对象在作用域中保留的时间只要上传或下载预计将继续。
我想知道是否有什么东西会给你上传多个文件的问题。我看到您正在使用browserForOpen()而不是browse()。看起来他们可能会做同样的事情……但也许不是。
我在File类文档
中也看到了这一点请注意,由于新功能添加到Flash Player,当发布到Flash Player 10,你只能有以下操作中的一个活动在同一时间:FileReference.browse(), FileReference.upload(), FileReference.download(), FileReference.load(), FileReference.save()。否则,Flash Player抛出运行时错误(代码2174)。使用filerreference .cancel()停止正在进行的操作。此限制仅适用于Flash Player 10。先前版本的Flash Player不受此同时多个操作的限制。
当你说你允许用户上传多个文件时,你是指随后调用browse()和upload()还是指一次调用包含多个文件?似乎,如果你试图做多个单独的电话,这可能是一个问题。
无论如何,我不知道这是否有多大帮助。显然,你想做的事情应该是可能的。我只能猜测,出了什么问题,也许是一个问题的执行。祝你好运:)参考:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html上传()
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#browse()
只是因为我在考虑一个非常类似的问题,因为我的一个实际应用程序中的一个错误,我决定写下我找到的答案。
我实例化了11
HttpConnections
并且想知道为什么我的Flex 4应用程序停止工作并抛出http错误,尽管它以前工作得很好,只有5个同时的HttpConnections到同一台服务器。
我自己测试了这个,因为我在Flex文档或互联网上没有找到任何关于这个的东西。
我发现使用超过5个HTTPConnections是Flex应用抛出运行时错误的原因。
我决定一个接一个地实例化连接,作为暂时的解决方案:在另一个接收到数据后加载下一个,等等。当然,这只是暂时的,因为接下来的步骤之一将是改变响应服务器代码,以便它在一个响应中响应包含多个表的请求结果的请求。当然,客户端应用程序逻辑也需要修改。