2014-10-03 4 views
1

Когда я использую метод Download класса FileReference, все отлично работает на рабочем столе и Android, но я получаю сообщение об ошибке в iOS.Adobe air on iOS - FileReference Ошибка загрузки

Это код:

var req = new URLRequest(url); 
var localRef:FileReference = new FileReference(); 
localRef.download(req); 

КСН я получаю предупреждение:

Ошибка загрузки
загрузки файлов не поддерживается.

Я уже пробовал NavigateToUrl(), и он просит сохранить файл в Dropbox или другом приложении.

Как исправить эту ошибку?

ответ

4

Вы не должны использовать FileReference на мобильном устройстве (или AIR, в общем, хотя он открывает диалоговое окно Load/Save на рабочем столе, поэтому там может быть какое-то использование). Вместо этого вы должны использовать File и FileStream, что дает вам гораздо больший контроль над файловой системой.

В этом случае вы можете попытаться использовать File.download() и сохранить его до File.applicationStorageDirectory, но я не знаю, будет ли он иметь какую-либо разницу, так как он расширяет FileReference.

Что я обычно делаю, это использование URLStream вместо URLLoader. Это дает вам доступ к необработанным байт файла, который вы скачиваете, а затем использовать File и FileStream

Так что-то подобное (и это не тестировалась с верхней части моей головы, хотя я использовал аналогичный в прошлом):

var urlStream:URLStream = new URLStream(); 
urlStream.addEventListener(Event.COMPLETE, completeHandler); 
urlStream.load(new URLLoader('url'); 

function completeHandler(e:Event):void { 
    var bytes:ByteArray = new ByteArray(); 
    urlStream.readBytes(bytes); 

    var f:File = File.applicationStorageDirectory.resolvePath('filename'); 
    var fs:FileStream = new FileStream(); 
    fs.open(f, FileMode.WRITE); 
    fs.writeBytes(bytes); 
    fs.close(); 
} 

Теперь, очевидно, есть намного больше, что вы хотите учитывать (ошибки, прогресс и т. Д.). Однако этого должно быть достаточно, чтобы указать вам в правильном направлении.

Возможно создание полного диспетчера загрузки с использованием этого метода (что-то, что я сделал для проекта iOS два года назад), поскольку вы можете сохранить как-вы-идти в файловую систему, а не ждать до тех пор, пока не погаснет Event.COMPLETE (используя ProgressEvent.PROGRESS события). Это позволяет избежать использования 500 МБ-файла в памяти, чего не может обрабатывать большинство устройств.

Смежные вопросы