【发布时间】:2011-01-03 22:01:58
【问题描述】:
是否可以在空中应用程序中开始下载、暂停下载然后再继续下载?
我想下载非常大的文件(1-3Gb),我需要确定连接是否中断,那么下次用户尝试下载文件时,它会从最后一个位置开始。
任何想法和源代码示例都将不胜感激。
【问题讨论】:
标签: apache-flex actionscript-3 air download
是否可以在空中应用程序中开始下载、暂停下载然后再继续下载?
我想下载非常大的文件(1-3Gb),我需要确定连接是否中断,那么下次用户尝试下载文件时,它会从最后一个位置开始。
任何想法和源代码示例都将不胜感激。
【问题讨论】:
标签: apache-flex actionscript-3 air download
如果您的目标是移动设备,也许您应该看看这个原生扩展:http://myappsnippet.com/download-manager-air-native-extension/ 它支持同时可恢复下载和多节块以尽可能快地下载文件。
【讨论】:
是的,您会想使用URLStream class(URLLoader 不支持部分下载)和HTTP Range header。请注意,Range 标头有一些繁重的安全限制,但在 AIR 应用程序中应该没问题。这是一些未经测试的代码,应该可以让您大致了解。
private var _us:URLStream;
private var _buf:ByteArray;
private var _offs:uint;
private var _paused:Boolean;
private var _intervalId:uint;
...
private function init():void {
_buf = new ByteArray();
_offs = 0;
var ur:URLRequest = new URLRequest( ... uri ... );
_us = new URLStream();
_paused = false;
_intervalId = setInterval(500, partialLoad);
}
...
private function partialLoad():void {
var len:uint = _us.bytesAvailable;
_us.readBytes(_buf, _offs, len);
_offs += len;
if (_paused) {
_us.close();
clearInterval(_intervalId);
}
}
...
private function pause():void {
_paused = true;
}
...
private function resume():void {
var ur:URLRequest = new URLRequest(... uri ...);
ur.requestHeaders = [new URLRequestHeader("Range", "bytes=" + _offs + "-")];
_us.load(ur);
_paused = false;
_intervalId = setInterval(500, partialLoad);
}
【讨论】: