Flex与java文件上传

蜀川居 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陈文锋54cwf@163.com

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.*@author54cwf@163.com

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.*@author54cwf@163.com

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.*@author54cwf@163.com

129.*@returnvoid

130.**/

131.privatefunctionTitleWindowClose(e:CloseEvent):void

132.{

133.PopUpManager.removePopUp(this);

134.}

135.

136./**Event事件监听处理函数,获取配置文件的文件上传路径

137.*@parame,事件参数

138.*@author54cwf@163.com

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>

相关推荐