flex上傳和下載文件主要通過FileReference類即可實現。
下載文件比較簡單:
public var fileRef:FileReference = new FileReference();
....
添加各種監聽
fileRef.addEventListener() {Event.COMPLETE Event.CANCEL ProgressEvent.PROGRESS 等}
...
fileRef.download(downloadURL,fileName);
然而,由於flash player的安全限制,download處會報出Error #2176的錯誤,因此需要通過觸發鼠標或按鈕事件來進行下載。
例如:
<pre name="code" class="java">public function getURLBack(url:String):void{
Alert.show("確定下載該文件?", "下載選擇", Alert.YES|Alert.NO, viewHandle, function(e:CloseEvent):void{alertClickHandler(e, url)});
}
private function alertClickHandler(evt:CloseEvent, url:String):void {
if (evt.detail == Alert.YES) {
var downLoadURL:URLRequest = new URLRequest(url);
fileRef = new FileReference();
...
添加各種監聽
...
try{
fileRef.download(downLoadURL,fileName);
}catch(errObject:Error) {
Alert.show("文件下載失敗!\n 原因:"+errObject.message);
}
}
}
這樣就不會catch到Error #2176的錯誤。可參考:https://forums.adobe.com/message/2848670 或 http://bbs.csdn.net/topics/350075799
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="left" verticalAlign="top" width="600" height="450" applicationComplete="initApp()">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import mx.controls.Alert;
public var test:int;
public var arr:ArrayCollection= new ArrayCollection();
public var arr2:ArrayCollection = new ArrayCollection();//存放爲被上傳的東西,與顯示無關
var myFileRef:FileReferenceList = new FileReferenceList();
public var array:Array=new Array();//用戶可能分幾次選擇,將每次選擇的內容放入數組中,點擊上傳後一起上傳
var urlRequest:URLRequest = new URLRequest("http://www.beijibear.com/flashupload.php");
private function initApp():void{
myFileRef.addEventListener(Event.SELECT,selectHandler);//監聽上傳對話框確定按鈕
//myFileRef.addEventListener(Event.CANCEL,cancelHandler);//監聽上傳對話框取消按鈕
}
private function selectHandler(event:Event):void {//上傳框確認按鈕按下
for(var i:int=0;i<myFileRef.fileList.length;i++){
var f:FileReference = FileReference(myFileRef.fileList[i]);
var obj:Object = new Object();
obj.fileRefrence = f;//與進度條綁定
obj.fileName =f.name;
obj.fileSize =(f.size/1024).toFixed(2)+"KB";//toFixed(num)四捨五入到小數點後幾位
obj.type = f.type;
arr.addItem(obj);
arr2.addItem(obj);
}
dataGrid.dataProvider=arr;
}
private function uploadCompleteHandler(event:Event):void {//刪除已上傳文件在數組中的信息
for each(var item in arr2)
{
if(item.fileRefrence==event.currentTarget)
{
arr2.source.indexOf(item);//找到已經上傳的文件,返回下標
var index:Number = arr2.source.indexOf(item);
arr2.removeItemAt(index);//刪除已經上傳的文件
}
}
}
private function select(event:MouseEvent):void{//瀏覽按鈕按下
myFileRef.browse();
}
//通過urlrequest對象創建一個與服務端的連接,然後直接調用fielreference類的upload()方法
private function onUpload(event:Event):void{
for(var i:int=0;i<arr2.length;i++){
var f:FileReference = FileReference(arr2[i]['fileRefrence']);
f.upload(urlRequest);
f.addEventListener(Event.COMPLETE, uploadCompleteHandler);
}
}
private function onCancel():void{
arr.removeAll();
arr2.removeAll();
dataGrid.dataProvider=arr;
}
]]>
</mx:Script>
<mx:Panel width="550" height="400" title="Upload" horizontalAlign="center" verticalAlign="middle">
<mx:DataGrid width="500" height="250" id="dataGrid">
<mx:columns>
<mx:DataGridColumn headerText="文件名稱" dataField="fileName" fontSize="12"/>
<mx:DataGridColumn headerText="文件大小" dataField="fileSize" fontSize="12"/>
<mx:DataGridColumn headerText="文件類型" dataField="type" fontSize="12"/>
<mx:DataGridColumn width="130" headerText="狀態" fontSize="12">
<mx:itemRenderer>
<mx:Component>
<mx:HBox width="300" paddingLeft="2" horizontalGap="2" verticalAlign="middle">
<mx:ProgressBar id="progress" width="100%"
minimum="0" maximum="100" source="{data.fileRefrence}"
labelPlacement="center"
label="%3%%">
</mx:ProgressBar>
<!--<mx:LinkButton width="15" label="取消" click="cancel(event)" icon="@Embed('_.png')">
<mx:Script>
<![CDATA[
private function cancel(event:MouseEvent):void{
data.fileRefrence.cancel();
progress.label = "已取消";
}
]]>
</mx:Script>
</mx:LinkButton>-->
<mx:LinkButton width="13" label="刪除" click="deleteItem(event)" icon="@Embed('x.png')" >
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.DataGrid;
import mx.controls.Alert;
private function deleteItem(event:MouseEvent):void {
var grid:Object = event.target.parent.parent.parent;
var dp:ArrayCollection = ArrayCollection(grid.dataProvider);
var index:int = dp.getItemIndex(data);
outerDocument.arr2.removeItemAt(index);
dp.removeItemAt(index);
grid.parent.refresh();
}
]]>
</mx:Script>
</mx:LinkButton>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:Canvas width="424" height="45">
<mx:Button label="瀏覽……" id="browse" right="118" click="select(event)" height="23" y="13" width="67" fontSize="12"/>
<mx:Button label="上傳" id="up" right="62" click="onUpload(event)" y="12" fontSize="12"/>
<mx:Button label="取消" id="cancel" right="6" y="12" fontSize="12" click="onCancel()"/>
</mx:Canvas>
</mx:Panel>
</mx:Application>
此段轉自:http://www.beijibear.com/index.php?aid=78