Adobe Air.Странная ошибка с URLStream или FileStream - PullRequest
1 голос
/ 16 февраля 2012

Я использовал примеры здесь Загрузите файл с помощью Adobe AIR и встроенное приложение, которое загружает файлы с сервера.

Я постараюсь объяснить ошибку пошагово.

1) Приложение Adobe Air загрузило XML-файл с сервера http://example.com/data/init.xml

2) Я открыл его и все в порядке.

3) Приложение Adobe Air снова загрузило тот же файл с сервера. Теперь, если я открываю его с помощью Блокнота, он говорит, что init.xml - это двоичный файл. Если я удалю init.xml с диска и попробую еще раз - то же самое. init.xml - это двоичный файл Приложение Reopen Air не работает.

4) Я изменил файл init.xml на сервере на init123.xml и снова загрузил его. init123.xml был открыт как обычный xml файл. Если я снова скачаю его, то шаг 3 - init123.xml - это двоичный файл.

Где может быть ошибка?

Спасибо.

ОС - Windows 7

MD5 файлов также изменилось.

Это можно решить, добавив случайное число в конец URL.

urlStream.load(new URLRequest(remoteFile+'?'+Math.random()));

но это

urlStream.load(new URLRequest(remoteFile));

делает файл двоичным, если я загружаю его второй раз.

Источник

    private function startDownloading():void
    {
        destFile.nativePath = destDirectory +destFileBase;

        fileStream = new FileStream();            
        fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, outputProgress);
        fileStream.addEventListener(IOErrorEvent.IO_ERROR, fileAccessError);
        fileStream.openAsync(destFile, FileMode.WRITE);

        urlStream = new URLStream();
        urlStream.addEventListener(ProgressEvent.PROGRESS, progress);
        urlStream.addEventListener(Event.COMPLETE, complete);
        urlStream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, urlStreamSecurityError);
        urlStream.addEventListener(IOErrorEvent.IO_ERROR, urlStreamIOError);
        urlStream.load(new URLRequest(remoteFile));
    }

    protected function fileAccessError(event:IOErrorEvent):void
    {
        urlStream.close();
        fileStream.close();

    }

    protected function outputProgress(event:OutputProgressEvent):void
    {
        if(event.bytesPending == 0 && downloadCompleteFlag ) {

        }
    }               

    protected function urlStreamIOError(event:IOErrorEvent):void
    {
        trace('error 2');
    }       

    protected function urlStreamSecurityError(event:SecurityErrorEvent):void
    {
        trace('error 2');
    }

    protected function progress(event:ProgressEvent):void
    {
        var bytes :ByteArray = new ByteArray();
        var thisStart :uint = currentPosition;
        currentPosition += urlStream.bytesAvailable;
        urlStream.readBytes( bytes, thisStart );
        fileStream.writeBytes( bytes, thisStart );

    }       
    protected function complete(event:Event):void
    {
        urlStream.close();
        fileStream.close();
        downloadCompleteFlag = true;
    }

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Попробуйте очистить файл назначения.Вы, вероятно, сохраняете предыдущие байты в init.xml .

0 голосов
/ 16 февраля 2012

Из того, что я могу сказать, изображение кэшируется, что может вызвать мгновенную загрузку файла.
Ваш код не справляется с этим, поскольку в полной функции вы не выполняете fileStream.writeBytes, что могло бы привестипустой файлЭто не проверенный код, но вам нужно сделать что-то вроде этого.

protected function progress(event:ProgressEvent):void
{
  var bytes :ByteArray = new ByteArray();
  var thisStart :uint = currentPosition;
  currentPosition += urlStream.bytesAvailable;
  urlStream.readBytes(bytes, thisStart );
  if(bytes.length > 0){
    fileStream.writeBytes( bytes, thisStart );
  }
}       
protected function complete(event:Event):void
{
  progress(event);// call progress to verify data is written
  urlStream.close();
  fileStream.close();
  downloadCompleteFlag = true;
}
0 голосов
/ 16 февраля 2012

Вы читаете и пишете из своего ByteArray в неправильной позиции. У вас есть:

// In "progress" function
urlStream.readBytes( bytes, thisStart );
fileStream.writeBytes( bytes, thisStart );

где thisStart - текущее количество байтов, доступных в urlStream.

При использовании URLStream.readBytes () position относится к позиции, с которой вы хотите начать чтение в bytes. Аналогично, параметр position в FileStream.writeBytes () относится к позиции, с которой вы хотите начать чтение с bytes. Поскольку bytes восстанавливается каждый раз при вызове progress(), вы всегда должны начинать чтение и запись с позиции 0.

...