【问题标题】:How can I convert a file to a ByteArray in Flex?如何在 Flex 中将文件转换为 ByteArray?
【发布时间】:2009-05-29 13:37:15
【问题描述】:

我想知道如何将我服务器上的文件 (pdf/excel/ppt) 转换为 ByteArray。我想这样做的原因是向用户显示打开/保存的对话框,我必须将 Content-Type 设置为八位字节流。仅使用 navigateToURL() 即可显示对话框,但对于 pdf,它是用户的本地浏览器设置。对于 URLRequest,我必须将数据设置为 ByteArray。我正在尝试使用位于此处的代码:

Custom printing with Flex

【问题讨论】:

    标签: apache-flex file-io


    【解决方案1】:

    如果您的目标是 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 时,字节被存储在loadedFile 中——当用户单击“保存图像”时,字节应该已准备好保存。测试并验证了示例工作。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      我认为你可以这样做来获取字节数组:

      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"); }
      

      编辑:我没有测试上述功能。如果您想直接加载字节,我建议您使用 Christian Nunciato 的答案,因为他的答案更好并且经过实际测试。

      但是,这听起来更像是您想直接从服务器检索文件,而不是进行三路旅行(文件来自服务器,您将字节发送回服务器,然后最后返回客户端)。在这种情况下,您可以尝试在服务器上将内容类型和内容处置设置为附件(例如,对于 pdf,这意味着将内容类型设置为“application/pdf”并添加“Content-Disposition: attachment; filename=myFileName. pdf”到您的响应标题)。

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多