在Adobe AIR 1.5中,我使用URLLoader以1 MB的块上传视频。它上传1 MB,等待Event.COMPLETE事件,然后上传下一个块。服务器端代码知道如何从这些块构建视频。
通常,它工作正常。但是,有时它会停止而不会抛出任何错误或调度任何事件。这是我创建的日志中显示的示例:
Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS dispatched: 200
HTTP_STATUS dispatched: 200
Completed chunk 1 of 108
Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS ...
等...
大多数情况下,它可以很好地完成所有块。然而,有时,它只是在中间失败:
Completed chunk 2 of 108
Uploading chunk of size: 1000000
......没有别的,也没有网络活动。
通过调试,我可以看出它确实成功调用了urlLoader.load()。当它失败时,它似乎停顿,调用load(),然后调用UIComponent的callLaterDispatcher(),然后什么都没有。
有谁知道为什么会发生这种情况?我正在设置我的URLLoader:
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, chunkComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, responseStatusHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, statusHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
我正在为每个块重新使用它。如果事件未成功则不会调用任何事件,并且urlLoader.load()不会抛出任何异常。成功时,将调度HTTP_RESPONSE_STATUS,HTTP_STATUS和PROGRESS事件。
谢谢!
编辑:可能有用的一点是,我们在.NET中实现了相同的上传功能。在.NET中,request.GetResponse()方法有时会抛出异常,抱怨连接意外关闭。如果发生这种情况,我们会捕获异常,并再次尝试该块,直到成功为止。我想在这里实现类似的东西,但没有抛出异常或调度错误事件。
下面有更详细的代码示例。 URLLoader的设置如上所述。 readAgain变量只是让它跳过读取文件流中的一组新字节(即:它尝试再次发送旧的字节)...但是,它永远不会捕获任何异常,因为没有任何异常被抛出。
private function uploadSegment():void
{
.... prepare byte array, setup url ...
// Create a URL request
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = _url + "?" + paramStr;
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = byteArray;
urlRequest.useCache = false;
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));
try
{
urlLoader.load(urlRequest);
}
catch (e:Error)
{
Logger.error("Failed to upload chunk. Caught exception. Trying again.");
readAgain = true;
uploadSegment();
return;
}
readAgain = false;
}
答案 0 :(得分:1)
您是否尝试过注册“Event.OPEN”以查看连接是否正确打开?如果你每个块都这样做 - 也许这个事件或缺乏会有帮助吗?
[编辑]
您是否也可以尝试在URLRequest上将useCache设置为false?
[编辑]
我假设你是urlLoader被全局引用...如果没有,当你在等待异步行为时,像GC这样邪恶的东西可能会伤害你......但是 - 跳过它,如果你在你的时候调用'bytesTotal' '等待某事发生 - 它总是返回零吗?
[详细]
另外 - 在发生NOTHING的情况下检查URL - 因为在线我发现有人提到如果服务器无法访问,则没有事件被触发(尽管有一些争论)......
答案 1 :(得分:0)
我在Flex中遇到了类似的问题,只有Safari。 URLloader有时什么都不返回,甚至没有返回OPEN事件。 我确保这不是缓存问题。
经过大量试用 和错误,我发现唯一的补救措施是在网址中使用https协议。我不确定这是做什么的 Safari,但现在问题已经消失。