1

我有一个场景,用户单击 flex 应用程序中的菜单项,该菜单项应该在他们的操作系统(现在是 Mac OSX)上为他们提供文件浏览器,然后一旦他们选择文件,我就会传递该文件的本地文件到应用程序的另一部分(已经编写)的路径,该部分使用它建立连接。

我做了一些研究,发现只有在包含我不喜欢的 AIR SDK 时才能使用的代码,有没有办法在 actionscript 或 javascript 中执行此操作(因为我可以从我的 actionscript 应用程序调用 javascript)?

编辑:我传递路径的服务需要完整的本地路径,这意味着浏览文件后,我必须获取本地路径才能传递它!

4

1 回答 1

1

在不使用 AIR 的情况下,您仍然可以使用带有 Flex 或纯 ActionScript 项目的FileReference类来生成用于上传本地文件的文件浏览对话框。

这可以抽象为一个服务类。

应用

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Script>
        <![CDATA[
            protected function buttonClickHandler(event:MouseEvent):void
            {
                var uploadService:UploadService = new UploadService("http://destination.com");
                uploadService.browse();
            }
        ]]>
    </fx:Script>

    <s:Button label="Upload..."
              click="buttonClickHandler(event)" />

</s:Application>

上传服务

package
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.net.URLRequest;

    public class UploadService extends EventDispatcher
    {

        public var fileReference:FileReference;

        public var fileTypes:FileFilter;

        public var uri:String

        public function UploadService(uri:String)
        {
            this.uri = uri;
        }

        public function browse():void
        {
            fileTypes = new FileFilter("* (*.*)", "*.*;");
            var allTypes:Array = new Array(fileTypes);

            fileReference = new FileReference();

            fileReference.addEventListener(Event.SELECT, fileSelectHandler);
            fileReference.addEventListener(Event.OPEN, fileOpenHandler);
            fileReference.addEventListener(Event.COMPLETE, fileCompleteHandler);
            fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileSecurityErrorHandler);
            fileReference.addEventListener(IOErrorEvent.IO_ERROR, fileIoErrorHandler);

            fileReference.browse(allTypes);
        }

        protected function fileSelectHandler(event:Event):void
        {
            fileReference.upload(new URLRequest(uri));
        }

        protected function fileOpenHandler(event:Event):void
        {
            dispatchEvent(new Event(Event.OPEN));
        }

        protected function fileCompleteHandler(event:Event):void
        {
            fileReference.removeEventListener(Event.SELECT, fileSelectHandler);
            fileReference.removeEventListener(Event.OPEN, fileOpenHandler);
            fileReference.removeEventListener(Event.COMPLETE, fileCompleteHandler);
            fileReference.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, fileSecurityErrorHandler);
            fileReference.removeEventListener(IOErrorEvent.IO_ERROR, fileIoErrorHandler);

            dispatchEvent(new Event(Event.COMPLETE));
        }

        protected function fileSecurityErrorHandler(event:SecurityErrorEvent):void
        {
            dispatchEvent(new SecurityErrorEvent(SecurityErrorEvent.SECURITY_ERROR));
        }

        protected function fileIoErrorHandler(event:IOErrorEvent):void
        {
            dispatchEvent(new IOErrorEvent(IOErrorEvent.IO_ERROR));
        }

    }
}
于 2012-07-07T22:41:21.637 回答