在 Adobe AIR 1.5 中,我使用 URLLoader 上传 1 MB block 的视频。它上传 1 MB,等待 Event.COMPLETE 事件,然后上传下一个 block 。服务器端代码知道如何从这些 block 构建视频。
通常,它工作正常。然而,有时它只是停止而没有抛出任何错误或调度任何事件。这是我创建的日志中显示的示例:
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 ...
ETC...
大多数时候,它可以很好地完成所有的 block 。但是,有时,它只是在中间失败:
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);
我正在为每个 block 重新使用它。不成功时不会调用任何事件,并且 urlLoader.load() 不会引发任何异常。成功时,将调度 HTTP_RESPONSE_STATUS、HTTP_STATUS 和 PROGRESS 事件。
谢谢!
编辑:可能有帮助的一件事是,我们在 .NET 中实现了相同的上传功能。在 .NET 中,request.GetResponse() 方法有时会抛出异常,提示连接意外关闭。如果发生这种情况,我们会捕获异常,并再次尝试该 block ,直到它成功。我希望在这里实现类似的东西,但是没有抛出异常或调度错误事件。
下面更详细的代码示例。 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;
}
最佳答案
您是否尝试注册“Event.OPEN”以查看连接是否正确打开?如果您按 block 执行此操作-也许该事件或缺少该事件会有所帮助?
[编辑]
您还可以尝试在 URLRequest 上将 useCache 设置为 false 吗?
[编辑]
我假设你的 urlLoader 是全局引用的......如果不是,当你等待异步行为时,像 GC 这样的邪恶可能会伤害你......但是 - 如果你在等待时调用 'bytesTotal' 跳过它发生某事 - 它总是返回零吗?
[更多的]
另外 - 在没有发生任何事情的情况下检查 URL - 因为在网上我发现有人提到如果服务器无法访问,则不会触发任何事件(尽管有一些争论)......
关于apache-flex - URLLoader 随机失败,不会引发错误或调度任何事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927189/