2009-05-29 3 views
1

Мне было интересно, как преобразовать файл, который у меня есть на моем сервере (pdf/excel/ppt), в ByteArray. Причина, по которой я хочу сделать это, - показать диалог открытым/сохраненным для пользователя, и я должен установить Content-Type в октет-поток. Диалог показывает, что только с помощью navigateToURL(), но для PDF-файлов это локальный браузер пользователя. Для URLRequest я должен установить данные как ByteArray. Я пытаюсь использовать код, расположенный здесь:Как преобразовать файл в ByteArray в Flex?

Custom printing with Flex

ответ

5

При условии, вы ориентируетесь Flash Player 10, это должно работать:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="loadFile()"> 

    <mx:Script> 
     <![CDATA[ 

      private var loadedFile:ByteArray; 

      private function loadFile():void 
      { 
       var request:URLRequest = new URLRequest("http://test.enunciato.org/sample.pdf"); 
       var urlLoader:URLLoader = new URLLoader(request); 

       urlLoader.addEventListener(Event.COMPLETE, onURLLoaderComplete); 
       urlLoader.dataFormat = URLLoaderDataFormat.BINARY; 
       urlLoader.load(request); 
      } 

      private function onURLLoaderComplete(event:Event):void 
      { 
       loadedFile = event.target.data; 
      } 

      private function saveLoadedFile():void 
      { 
       var file:FileReference = new FileReference(); 
       file.save(loadedFile, "SampleDoc.PDF"); 
      } 

     ]]> 
    </mx:Script> 

    <mx:Button label="Save Image" horizontalCenter="0" verticalCenter="0" click="saveLoadedFile()" /> 

</mx:Application> 

Предполагая, что вы загрузите файл первой - в этом примере, операция загрузки происходит на creationComplete, и байты откладываются от в loadFile - байты должны быть и готовы к сохранению, когда пользователь нажимает кнопку Сохранить изображение. Протестировано и проверено, что пример работает. Надеюсь, поможет!

0

Я думаю, что вы можете сделать что-то вроде этого, чтобы принести массив байт:

private var fileBytes:ByteArray = null; 

private static function loadByteArray(url:String):void { 
     var loader:Loader = new Loader(); 

     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
     function(e:Event):void { 
     fileBytes = e.currentTarget.bytes; 
     }); 
     loader.load(new URLRequest(encodeURI(url))); 
} 

// static initializer 
{ loadByteArray("my url here"); } 

Edit: Я Жду» t проверить вышеуказанную функцию. Если вы хотите напрямую загрузить байты, я бы предложил использовать ответ Кристиана Нунциато, так как его лучше и фактически проверять.

Тем не менее, это похоже на то, что вы хотите получить файл непосредственно с вашего сервера, в отличие от трехсторонней поездки (файл поступает с сервера, вы отправляете байты обратно на сервер, а затем, наконец, возвращаетесь клиенту). В этом случае вы можете попробовать установить тип контента и размещение контента на вложение на сервере (например, для pdf, это означало бы установку типа содержимого на «application/pdf» и добавление «Content-Disposition: attachment; filename = myFileName». pdf "в ваши заголовки ответов).

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