网上查了大多很普遍的方法是Flex调用javaScript的文件浏览功能来获取文件路径,网上的方法都不太全面,都得少许的添加和改动,先在总结出来了,供以后的项目里参考:
一、假如你新建一个项目名为getFilePath
首先在项目的creationComplete或者initialize下注册事件,这是是注册init()函数。
下面是Flex端代码:
<fx:Script> <![CDATA[ import flash.net.FileFilter; import flash.net.FileReference; import mx.controls.Alert; import flash.external.ExternalInterface; private function init():void { ExternalInterface.addCallback("getPath",getPath);//注册JS回调,第一个getPath为调用js端方法,第二个Flex端对应的接收方法 btnBrowser.addEventListener(MouseEvent.CLICK,mouseClickHandler); } private function mouseClickHandler(event:MouseEvent):void { ExternalInterface.call("Browser");//调用JS中Browser函数 } public function getPath(path:String):void { showPath.text=path; } ]]> </fx:Script>
<s:Button x="360" y="50" label="浏览" id="btnBrowser"/>
<s:TextInput x="33" y="49" width="303" id="showPath"/>
二、javascript端方法
在html-template => index.template.html的<head></head>中,添加方法
<script language="JavaScript" type="text/javascript"> var requiredMajorVersion = 9; var requiredMinorVersion = 0; var requiredRevision = 28; function Browser() { document.getElementById("fileInput").click(); tempForm.reset(); } function OnFileChange() { uploadPIcture.getPath(document.getElementById("fileInput").value); } </script>
在body里添加
<form id="tempForm" name="form1">
<input type="file" id="fileInput" style="display:none" onchange="OnFileChange()"/>
</form>
注:此处多加一个<form>控件,是因为有时候在连续调用两次文件浏览控件时,会出现上一个选择文件记录没有被清空,因此每当调用文件浏览控件时,都要reset()一下。
到此就ok了,运行有课能会出现所有的路径都显示C:\fakePath\+文件名的问题,网上查了是ie8下安全级别设置的问题,解决办法如下:
工具 -> Internet选项 -> 安全 -> 自定义级别 -> 找到“其他”中的“将本地文件上载至服务器时包含本地目录路径”,选中“启用”即可。
网上也有不用设置就可以解决的代码,不过我没试过,贴过来,留作参考:
//附带不用修改浏览器安全配置的javascript代码,兼容ie, firefox全系列 function getPath(obj) { if(obj) { if (window.navigator.userAgent.indexOf("MSIE")>=1) { obj.select(); return document.selection.createRange().text; } else if(window.navigator.userAgent.indexOf("Firefox")>=1) { if(obj.files) { return obj.files.item(0).getAsDataURL(); } return obj.value; } return obj.value; } } //参数obj为input file对象