这是个实现Flex多文件上传的事例。
新建一个UploadFile.mxml文件。如下:
layout="vertical" horizontalAlign="left" fontSize="12"
creationComplete="init()"
>
import mx.collections.ArrayCollection;
import mx.controls.Alert;
private var fileRefs:FileReferenceList = new FileReferenceList();
private var urlrequest:URLRequest = new URLRequest("http://localhost:8080/LCDSFirst/UploadFile");
//LCDSFirst是项目根目录。UploadFile,是在web.xml文件中配置的servlet-name。
[Bindable]
private var selectedFiles:ArrayCollection = new ArrayCollection();
private var singleThreadFiles:Array = [];
[Bindable]
private var useSingleThread: Boolean = true;
private function init():void{
fileRefs.addEventListener(Event.SELECT,fileSelectHandler);
fileRefs.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
fileRefs.addEventListener(Event.COMPLETE,completeHandler);
fileRefs.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
}
private function selectFile():void{
var imagesFilter:FileFilter = new FileFilter("Images(*.jpg,*.png,*.gif,*.jpeg)","*.jpg, *.jpeg, *.gif, *.png");
var docFilter:FileFilter = new FileFilter("所有文件(*.*)","*.*");
fileRefs.browse([imagesFilter,docFilter]);
}
private function fileSelectHandler(event:Event):void{
for each(var f:FileReference in fileRefs.fileList){
selectedFiles.addItem(f);
}
}
private function ioErrorHandler(e:IOErrorEvent):void{
Alert.show(e.text);
}
private function completeHandler(e:Event):void{
//var f:FileReference = e.target as FileReference;
img.source = e.target.data;
}
private function showImage(e:Event):void{
var f:FileReference = (e.target as DataGrid).selectedItem as FileReference;
f.addEventListener(Event.COMPLETE,completeHandler);
}
private function uploadFile():void{
for each(var f:FileReference in selectedFiles){
try{
f.upload(urlrequest);
}catch(e:Error){
Alert.show(e.message);
}
}
}
private function singleThreadUploadFile():void{
if(singleThreadFiles.length > 0){
var f:FileReference = singleThreadFiles.pop() as FileReference;
f.addEventListener(Event.COMPLETE,doSingleUploadFileComplete);
f.upload(urlrequest);
}
}
private function doSingleUploadFileComplete(event:Event):void{
var f:FileReference = event.target as FileReference;
f.removeEventListener(Event.COMPLETE,doSingleUploadFileComplete);
singleThreadUploadFile();
}
public function removeFile(f:FileReference):void{
var index:int = selectedFiles.getItemIndex(f);
if(index != -1){
selectedFiles.removeItemAt(index);
}
}
]]>
import mx.controls.ProgressBar;
private function initProgressBar(event:Event):void{
var pb:ProgressBar = event.target as ProgressBar;
pb.label="%3%%";
pb.setProgress(0,100);
var f:FileReference = data as FileReference;
f.addEventListener(ProgressEvent.PROGRESS,
function(event:ProgressEvent):void{
pb.setProgress(event.bytesLoaded ,event.bytesTotal);
}
);
f.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,
function(event:DataEvent):void{
pb.label = event.data;
}
);
}
]]>
maximum="100" minimum="0" labelPlacement="center" mode="manual"
label="%3%%" textAlign="left" creationComplete="initProgressBar(event)"/>
var f:FileReference = data as FileReference;
f.cancel();
]]>
var f:FileReference = data as FileReference;
outerDocument.removeFile(f);
]]>
if(useSingleThread){
singleThreadFiles = selectedFiles.toArray().concat();
singleThreadFiles.reverse();
singleThreadUploadFile();
}else{
uploadFile();
}
]]>
change="useSingleThread = !checkboxSingleThread.selected"/>
其次,建一个UploadFile.java.如下:
package com;
import java.io.IOException;
import java.util.List;
import java.io.File;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import java.util.Iterator;
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 UploadFile extends HttpServlet {
private static final long serialVersionUID = 5425836142860976977L;
/** *//**
* Processes requests for both HTTP GET
and POST
methods.
* @param request servlet request
* @param response servlet response
*/
// �����ļ����ϴ�·��
private String uploadPath = "d://files//";
//�����ļ����ϴ���С
private int maxPostSize = 100 * 1024 * 1024; //���100M
public UploadFile(){
super();
}
public void destroy(){
super.destroy();
}
protected void processRequest(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
System.out.println("Access !");
response.setContentType("text/html;charset=UTF-8");
//�����ļ�����������
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("utf-8");
upload.setFileSizeMax(maxPostSize);
try{
List fileItems = upload.parseRequest(request);
Iterator iter = fileItems.iterator();
while(iter.hasNext()){
FileItem item = (FileItem)iter.next();
if(!item.isFormField()){
String name = item.getName();
System.out.println(name);
try{
item.write(new File(uploadPath + name));
response.getWriter().write("�ϴ��ɹ���");
}catch(Exception e){
e.printStackTrace();
response.getWriter().write(e.getMessage());
}
}
}
}catch(FileUploadException e){
e.printStackTrace();
response.getWriter().write(e.getMessage());
System.out.println(e.getMessage() + "����");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** *//**
* Handles the HTTP POST
method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/** *//**
* Returns a short description of the servlet.
*/
public String getServletInfo() {
return "Short description";
}
}
在web.xml文件中配置这个java类文件。如下:
UploadFile
File Upload Servlet
File Servlet Example
com.UploadFile
UploadFile
/UploadFile