蜀川居 2011-08-21
在Adobe的FlexRIA编程环境下,是无法读取本地文件的(据我所知),但是我们可以依赖于Flex调用后台的代码实现文件上传功能,我这里是利用Flex的URLRequest来向java的Servlet传送一个Http请求(Servlet集成自HttpServlet,已实现文件上传功能),而Servlet响应请求之后会利用Apcahe的开源Jar包(org.apache.commons.fileupload.servlet.ServletFileUpload类)完成文件的生成。通过以上原理就可以利用Flex+java实现文件上传。(这里也是参考了网上的一些文章)
javaServlet代码
Java代码
1.packagecom.yyhy.java.util;
2.
3.//多文件上传的Java端的类
4.importjavax.servlet.http.HttpServlet;
5.importjavax.servlet.http.HttpServletRequest;
6.importjavax.servlet.http.HttpServletResponse;
7.importjavax.servlet.ServletException;
8.importjava.util.List;
9.importjava.util.Iterator;
10.importjava.io.File;
11.importjava.io.IOException;
12.importjava.io.UnsupportedEncodingException;
13.importjava.net.URLDecoder;
14.importorg.apache.commons.fileupload.FileUploadException;
15.importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
16.importorg.apache.commons.fileupload.servlet.ServletFileUpload;
17.importorg.apache.commons.fileupload.FileItem;
18.importorg.apache.log4j.Logger;
19.importorg.apache.commons.lang.ObjectUtils;
20.importorg.springframework.context.ApplicationContext;
21.importorg.springframework.context.support.ClassPathXmlApplicationContext;
22.
23.
24.publicclassFileUploadActionextendsHttpServlet{
25.
26.//限制文件的上传大小
27.privateintmaxPostSize=100*1024*1024;
28.//文件上传地址
29.privateStringuploadPath;
30.
31.publicFileUploadAction(){
32.//从配置文件中取得文件上传地址
33.setUploadPath();
34.}
35.publicStringgetUploadPath(){
36.returnuploadPath;
37.}
38.publicvoidsetUploadPath(){
39.//从配置文件中取得文件上传地址
40.ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
41.ServerAddressserverAddressBean=(ServerAddress)context.getBean("ServerAddressBean");
42.this.uploadPath=serverAddressBean.getUploadPath().trim();
43.}
44.//文件上传
45.publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
46.throwsServletException
47.{
48.this.doUploadAdd(request,response);
49.}
50.
51.privatevoidlogger(Stringinfo){
52.System.out.println(info);
53.}
54.
55.protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
56.throwsServletException,IOException{
57.doUploadAdd(request,response);
58.}
59.
60.protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
61.throwsServletException,IOException{
62.doUploadAdd(request,response);
63.}
64.
65.privatevoiddoUploadAdd(HttpServletRequestrequest,
66.HttpServletResponseresponse)throwsServletException{
67.logger("begintoupload");
68.try{
69.request.setCharacterEncoding("UTF-8");//防止文件名称带有汉字后传到服务器乱码
70.//建立文件夹
71.this.makeDir(uploadPath);
72.}catch(UnsupportedEncodingExceptione){
73.//TODOAuto-generatedcatchblock
74.e.printStackTrace();
75.}
76.saveFiletoServer(request,response,uploadPath);
77.}
78.
79.privatevoiddoUploadDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException
80.{
81.StringdirtyStr="";//需要删除的文件名(单个文件)或文件夹名列表
82.try
83.{
84.if(request.getParameter("dirtyStr")!=null){
85.dirtyStr=URLDecoder.decode(request.getParameter("dirtyStr"),"utf-8");//前台ENCODE,后台DECODE
86.logger("删除的文件(夹)为:"+dirtyStr);
87.}
88.}
89.catch(Exceptione){
90.//TODOAuto-generatedcatchblock
91.logger(e.getMessage());
92.}
93.
94.try{
95.newDeleteFiles().DeleteModifyFiles(dirtyStr,uploadPath);
96.}catch(Exceptione){
97.logger(e.getMessage());
98.}
99.}
100.//保存文件到服务器中
101.privatevoidsaveFiletoServer(HttpServletRequestrequest,HttpServletResponseresponse,StringuploadPath)
102.{
103.//操作文件
104.response.setContentType("text/html;charset=UTF-8");
105.DiskFileItemFactoryfactory=newDiskFileItemFactory();
106.factory.setSizeThreshold(1024*4);
107.ServletFileUploadupload=newServletFileUpload(factory);
108.upload.setFileSizeMax(maxPostSize);
109.logger("request========"+ObjectUtils.toString(request));
110.ListfileItems=null;
111.try{
112.fileItems=upload.parseRequest(request);
113.logger("============"+ObjectUtils.toString(fileItems));
114.Iteratoriter=fileItems.iterator();
115.while(iter.hasNext()){
116.FileItemitem=(FileItem)iter.next();
117.log(item.toString());
118.if(!item.isFormField()){
119.Stringname=item.getName();
120.logger("上传的文件名="+name);
121.try{
122.item.write(newFile(uploadPath+name));
123.}catch(Exceptionex){
124.logger(ex.getMessage());
125.}
126.}
127.}
128.}catch(FileUploadExceptionex1){
129.logger("FileUploadException->"+ex1.getMessage());
130.}
131.}
132.//建立文件夹路径
133.privatebooleanmakeDir(StringuploadPath){
134.booleanisOK=false;
135.try{
136.Filefile=newFile(uploadPath);
137.file.mkdirs();
138.isOK=true;
139.}catch(Exceptione){
140.isOK=false;
141.}finally{
142.returnisOK;
143.}
144.}
145.//建立文件夹路径
146.privatebooleanmakeDirs(StringuploadPath,StringnewDocStr){
147.booleanisOK=false;
148.Filefile;
149.String[]temp;
150.try{
151.temp=newDocStr.split(",");
152.for(inti=0;i<temp.length;i++){
153.file=newFile(uploadPath+temp[i]+"\\");
154.file.mkdirs();
155.}
156.isOK=true;
157.}catch(Exceptione){
158.isOK=false;
159.}finally{
160.returnisOK;
161.}
162.}
163.}
packagecom.yyhy.java.util;
//多文件上传的Java端的类
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.ServletException;
importjava.util.List;
importjava.util.Iterator;
importjava.io.File;
importjava.io.IOException;
importjava.io.UnsupportedEncodingException;
importjava.net.URLDecoder;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.log4j.Logger;
importorg.apache.commons.lang.ObjectUtils;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassFileUploadActionextendsHttpServlet{
//限制文件的上传大小
privateintmaxPostSize=100*1024*1024;
//文件上传地址
privateStringuploadPath;
publicFileUploadAction(){
//从配置文件中取得文件上传地址
setUploadPath();
}
publicStringgetUploadPath(){
returnuploadPath;
}
publicvoidsetUploadPath(){
//从配置文件中取得文件上传地址
ApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
ServerAddressserverAddressBean=(ServerAddress)context.getBean("ServerAddressBean");
this.uploadPath=serverAddressBean.getUploadPath().trim();
}
//文件上传
publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException
{
this.doUploadAdd(request,response);
}
privatevoidlogger(Stringinfo){
System.out.println(info);
}
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doUploadAdd(request,response);
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doUploadAdd(request,response);
}
privatevoiddoUploadAdd(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException{
logger("begintoupload");
try{
request.setCharacterEncoding("UTF-8");//防止文件名称带有汉字后传到服务器乱码
//建立文件夹
this.makeDir(uploadPath);
}catch(UnsupportedEncodingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
saveFiletoServer(request,response,uploadPath);
}
privatevoiddoUploadDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException
{
StringdirtyStr="";//需要删除的文件名(单个文件)或文件夹名列表
try
{
if(request.getParameter("dirtyStr")!=null){
dirtyStr=URLDecoder.decode(request.getParameter("dirtyStr"),"utf-8");//前台ENCODE,后台DECODE
logger("删除的文件(夹)为:"+dirtyStr);
}
}
catch(Exceptione){
//TODOAuto-generatedcatchblock
logger(e.getMessage());
}
try{
newDeleteFiles().DeleteModifyFiles(dirtyStr,uploadPath);
}catch(Exceptione){
logger(e.getMessage());
}
}
//保存文件到服务器中
privatevoidsaveFiletoServer(HttpServletRequestrequest,HttpServletResponseresponse,StringuploadPath)
{
//操作文件
response.setContentType("text/html;charset=UTF-8");
DiskFileItemFactoryfactory=newDiskFileItemFactory();
factory.setSizeThreshold(1024*4);
ServletFileUploadupload=newServletFileUpload(factory);
upload.setFileSizeMax(maxPostSize);
logger("request========"+ObjectUtils.toString(request));
ListfileItems=null;
try{
fileItems=upload.parseRequest(request);
logger("============"+ObjectUtils.toString(fileItems));
Iteratoriter=fileItems.iterator();
while(iter.hasNext()){
FileItemitem=(FileItem)iter.next();
log(item.toString());
if(!item.isFormField()){
Stringname=item.getName();
logger("上传的文件名="+name);
try{
item.write(newFile(uploadPath+name));
}catch(Exceptionex){
logger(ex.getMessage());
}
}
}
}catch(FileUploadExceptionex1){
logger("FileUploadException->"+ex1.getMessage());
}
}
//建立文件夹路径
privatebooleanmakeDir(StringuploadPath){
booleanisOK=false;
try{
Filefile=newFile(uploadPath);
file.mkdirs();
isOK=true;
}catch(Exceptione){
isOK=false;
}finally{
returnisOK;
}
}
//建立文件夹路径
privatebooleanmakeDirs(StringuploadPath,StringnewDocStr){
booleanisOK=false;
Filefile;
String[]temp;
try{
temp=newDocStr.split(",");
for(inti=0;i<temp.length;i++){
file=newFile(uploadPath+temp[i]+"\\");
file.mkdirs();
}
isOK=true;
}catch(Exceptione){
isOK=false;
}finally{
returnisOK;
}
}
}
Flex前台代码:
Actionscript代码
1.<?xmlversion="1.0"encoding="utf-8"?>
2.<mx:TitleWindowxmlns:fx="http://ns.adobe.com/mxml/2009"
3.xmlns:s="library://ns.adobe.com/flex/spark"
4.xmlns:mx="library://ns.adobe.com/flex/halo"layout="absolute"width="400"height="300"
5.creationComplete="CreationCompletedHandler()"
6.showCloseButton="true">
7.<fx:Script>
8.<![CDATA[
9.importmx.controls.Alert;
10.importmx.events.CloseEvent;
11.importmx.managers.PopUpManager;
12.importmx.utils.StringUtil;
13.
14.[Bindable]
15.privatevar_filename:String;
16.
17.publicfunctiongetfilename():String
18.{
19.return_filename;
20.}
21.
22.publicfunctionsetfilename(value:String):void
23.{
24._filename=value;
25.}
26.
27.
28.[Bindable]
29.privatevar_file:FileReference=newFileReference();
30.
31.publicfunctiongetfile():FileReference
32.{
33.return_file;
34.}
35.
36.publicfunctionsetfile(value:FileReference):void
37.{
38._file=value;
39.}
40.
41.
42.[Bindable]
43.privatevar_serveraddress:String;
44.
45.publicfunctiongetserveraddress():String
46.{
47.return_serveraddress;
48.}
49.
50.publicfunctionsetserveraddress(value:String):void
51.{
52._serveraddress=value;
53.}
54.
55./**creationComplete完成之后调用,获取服务器地址,建立事件监听
56.*@paramnull
57.*@author陈文锋[email protected]
58.*@returnvoid
59.**/
60.publicfunctionCreationCompletedHandler():void
61.{
62.Security.allowDomain("*");
63.varurlLoader:URLLoader=newURLLoader(newURLRequest("assets/conf/ServerAddressConfig.xml"));
64.urlLoader.addEventListener(Event.COMPLETE,CompletedHandler);
65.this.addEventListener(Event.CLOSE,TitleWindowClose);
66.file.addEventListener(ProgressEvent.PROGRESS,progressHandler);
67.file.addEventListener(Event.SELECT,selectedHandler);
68.file.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
69.}
70.
71.privatefunctionioErrorHandler(e:IOErrorEvent):void
72.{
73.Alert.show(e.toString());
74.}
75.
76.privatefunctionprogressHandler(e:ProgressEvent):void
77.{
78.lblProgress.text="已上传"+e.bytesLoaded
79.+"字节,共"+e.bytesTotal+"字节";
80.varproc:uint=e.bytesLoaded/e.bytesTotal*100;
81.uploadbar.setProgress(proc,100);
82.uploadbar.label="当前进度:"+""+proc+"%";
83.}
84.
85./**Event事件监听处理函数,弹出上传提示窗口
86.*@parame,Event类型事件参数
87.*@[email protected]
88.*@returnvoid
89.**/
90.privatefunctionselectedHandler(e:Event):void
91.{
92.Alert.show("上传"+file.name+"(共"+Math.round(file.size/1024)+"KB)?",
93."确认上传",
94.Alert.YES|Alert.NO,
95.null,
96.proceedWithUpload);
97.}
98.
99./**CloseEvent事件监听处理函数,访问upload的servlet服务
100.*@parame,Event类型事件参数
101.*@[email protected]
102.*@returnvoid
103.**/
104.privatefunctionproceedWithUpload(e:CloseEvent):void{
105.if(e.detail==Alert.YES)
106.{
107.filename=file.name;
108.varrequest:URLRequest=newURLRequest(StringUtil.trim(serveraddress));
109.try
110.{
111.file.upload(request);
112.}
113.catch(error:Error)
114.{
115.Alert.show("上传失败","错误");
116.}
117.
118.}
119.}
120.
121.privatefunctionupload():void{
122.vartypefiter:FileFilter=newFileFilter("Excel","*.xls");
123.file.browse([typefiter]);
124.}
125.
126./**CloseEvent事件监听处理函数,关闭TitleWindow弹出窗口
127.*@parame,事件参数
128.*@[email protected]
129.*@returnvoid
130.**/
131.privatefunctionTitleWindowClose(e:CloseEvent):void
132.{
133.PopUpManager.removePopUp(this);
134.}
135.
136./**Event事件监听处理函数,获取配置文件的文件上传路径
137.*@parame,事件参数
138.*@[email protected]
139.*@returnvoid
140.**/
141.privatefunctionCompletedHandler(e:Event):void
142.{
143.varconfigurationxml:XML=XML((URLLoader(e.target).data));
144.serveraddress=configurationxml.filesinservername;
145.}
146.]]>
147.</fx:Script>
148.<mx:Canvaswidth="100%"height="100%">
149.<mx:VBoxwidth="100%"horizontalalign="center">
150.<mx:Labelid="lblProgress"text="上传"/>
151.<mx:ProgressBarid="uploadbar"labelPlacement="bottom"themeColor="#F20D7A"
152.minimum="0"visible="true"maximum="100"label="当前进度:0%"
153.direction="right"mode="manual"width="200"/>
154.<mx:Buttonlabel="上传文件"click="upload()"/>
155.</mx:VBox>
156.</mx:Canvas>
157.</mx:TitleWindow>