和傳統的JSP一樣,在flex中,有的時候也需要實現文件上傳和下載的功能,但是在flex里文件的上傳和下載的實現相對來說比較復雜,如何實現,請看下面。
由于flex是一個比較新的技術,在研究的時候,還是按著JSP的方式去嘗試,在開始之初,主要有以下幾種思路:
A、利用ftp的方式進行文件的上傳和下載,需要利用flex的socket接口。
B、利用webService的方式來進行文件的上傳和下載
C、利用flex+sevlet+fileupload組件實現文件的上傳和下載
在通過比較后,最后選擇了第三種,用Flex+sevlet的方式來完成文件上傳和下載的功能,理由如下(與上面的思路相對應):
A、涉及到了流的操作,實現起來比較復雜,出現錯誤的幾率比較高
B、關于flex端的可參考的資料比較少,并且還需要啟動webservice服務
C、這個技術比較成熟,從flex2.0開始,在flex端已經可以引用FileReference類了,并且在java端有成熟的組件可以使用,所以最后考慮使用該種方法來處理。
一、文件的上傳
1、Flex端
A、使用到的類介紹:
FileReference 類提供了在用戶計算機和服務器之間上載和下載文件的方法。 操作系統對話框會提示用戶選擇要上載的文件或用于下載的位置。它主要能實現一個文件的上傳。
FileReferenceList 類提供了讓用戶選擇一個或多個要上載的文件的方法。 FileReferenceList 對象將用戶磁盤上的一組本地文件(一個或多個文件)表示為 FileReference 對象的數組。
B、使用 FileReferenceList 類 實現多文件上傳:
1) 將該類實例化:var myFileRef = new FileReferenceList();
2) 調用 FileReferenceList.browse() 方法,該方法將打開一個對話框,讓用戶選擇一個或多個要上載的文件:myFileRef.browse();
3) 在成功調用 browse() 方法之后,使用 FileReference 對象數組來填充 FileReferenceList 對象的 fileList 屬性。
對 fileList 數組中的每個元素調用 FileReference.upload()
代碼如下:

/** *//**
* 執行上傳操作
* */
private function upLoadFiles():void

{
try

{
selectFileList.browse(new Array(imageFilter, textFilter));
selectFileList.addEventListener(Event.SELECT, selectHandler1);
}
catch (error:Error)

{
Alert.show("文件選擇出現錯誤,請選擇正確的文件");
}
}

/** *//**
* 如果文件被選中,則執行該方法
* */
function selectHandler1(event:Event):void

{
var request:URLRequest = new URLRequest("FileUploadServlet");
var upLoadFile:FileReference;
var upLoadFileList:FileReferenceList = FileReferenceList(event.target);
var selectedFileArray:Array = upLoadFileList.fileList;
login =(testPress)(PopUpManager.createPopUp( this, testPress , true));
for (var i:uint = 0; i < selectedFileArray.length; i++)

{
upLoadFile = FileReference(selectedFileArray[i]);
upLoadFile.addEventListener(Event.COMPLETE, UpLoadcompleteHandler);
upLoadFile.addEventListener(ProgressEvent.PROGRESS, progressHandler);
try

{
upLoadFile.upload(request);
}
catch (error:Error)

{
Alert.show(error.message.toString());
}
}
}
function UpLoadcompleteHandler(event:Event):void

{
var upLoadFiles:FileReference = FileReference(event.target);
var fileNames = upLoadFiles.name;
//Alert.show('文件'+fileNames+'上傳成功')
login.myLabels.text = '文件'+fileNames+'上傳成功';
}
private function progressHandler(e:ProgressEvent):void

{
var proc: uint = e.bytesLoaded / e.bytesTotal * 100;
login.bar.setProgress(proc, 100);
login.bar.label= "當前進度: " + " " + proc + "%";
}
testPress.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="528" height="236">
<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;
public function clickMe():void {
PopUpManager.removePopUp(this);
}
]]>
</mx:Script>
<mx:ProgressBar id="bar" labelPlacement="bottom" themeColor="#F20D7A"
minimum="0" visible="true" maximum="100" label="當前進度: 0%"
direction="right" mode="manual" width="200" x="154" y="84"/>
<mx:Button x="221" y="135" label="關閉" click = "clickMe();"/>
<mx:Label x="173" y="27" id="myLabels" width="157"/>

</mx:TitleWindow>

2、JAVA端
接受Flex端的請求,在JAVA端利用apache的fileupload類庫實現上傳功能。代碼如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet


{

// private String uploadPath = "D:\\upload\\";
private String path = "file_path.properties";
private String skStr = "";
private String uploadPath = "";
private int maxPostSize = 1000 * 1024 * 1024;

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,
IOException

{
String filePathaa = this.getServletConfig().getServletContext().getRealPath("/");

Properties p = loadProperties(path);

uploadPath = p.getProperty("filepath");

res.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*20);

ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(maxPostSize);
try

{
List fileItems = upload.parseRequest(req);
Iterator iter = fileItems.iterator();
while (iter.hasNext())

{
FileItem item = (FileItem) iter.next();
if (!item.isFormField())

{
String name = item.getName();

try

{
File skFile = new File(uploadPath + name);
if (skFile.exists())

{
skFile.delete();
item.write(new File(uploadPath + name));

}
else

{
item.write(new File(uploadPath + name));
}

} catch (Exception e)

{
e.printStackTrace();
}
}
}
} catch (FileUploadException e)

{
e.printStackTrace();
}

}

public Properties loadProperties(String path) throws IOException

{

InputStream in = this.getClass().getResourceAsStream(path);
//

Properties p = new Properties();

p.load(in);
in.close();
return p;
}

}
還要修正web.xml,添加如下內容
<!-- For file uploaded -->
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>FileUploadServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/FileUploadServlet</url-pattern>
</servlet-mapping>
二、文件的下載
調用的方法:private function downLoadFiles(urlAdd:String):void
參數urlAdd就是用戶的ip地址,如果使用本地的localhost就會產生安全沙箱問題,因此讓用戶自己輸入自己的ip地址。這樣就避免了安全沙箱的問題。如果是本機啟動服務,訪問地址,需要輸入IP,不能用localhost來代替本機的IP地址,否則,還是會出現安全沙箱問題。
FileReference.download() 方法提示用戶提供文件的保存位置并開始從遠程 URL 進行下載。直接加載請求路徑下載,不需要后臺的支持。代碼如下:
import com.systex.flex.util.testPress;

import flash.net.FileReferenceList;

import mx.controls.Alert;
import mx.managers.PopUpManager;
var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf, *.zip)", "*.txt; *.rtf; *.zip");
var selectFileList:FileReferenceList = new FileReferenceList();
var selectedFileArray:Array = new Array();
var login:testPress = new testPress();
var downloadURL:URLRequest;
var DownLoadfile:FileReference; //這是要主要的地方
//http://XX.XX.XX.XX:8080/upload/main.zip
private function downLoadFiles(urlAdd:String):void

{
downloadURL = new URLRequest(urlAdd);
DownLoadfile = new FileReference();
configureListeners(DownLoadfile);
DownLoadfile.download(downloadURL);
}

private function configureListeners(dispatcher:IEventDispatcher):void
{
dispatcher.addEventListener(Event.COMPLETE, completeHandler);

}

private function completeHandler(event:Event):void
{
mx.controls.Alert.show("文件下載成功");
}
這里的是上面上傳代碼的上部分
附上測試的MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
>
<mx:Script source="UpDownLoadFiles.as"/>

<mx:Canvas width="100%" height="100%" x="10" y="170" fontSize="15">
<mx:VBox width="100%" horizontalAlign="center">
<mx:TextInput id="mytextInput"/>
<mx:Button label="文件下載" click="downLoadFiles('http://'+mytextInput.text+':8080/downLoading/2MSN.rar');"/>
<mx:Button label="上傳文件" click="upLoadFiles();"/>
</mx:VBox>
</mx:Canvas>
</mx:Application>
fileupload下載地址就不提供了,請到網上搜尋一下