struts2控制文件上传和下载
2017-02-20 23:22
453 查看
为了能上传文件,我们必须将表单的method设置为post,同时将enctype设置为mutipart/form-data。在struts2的struts2.properties文件中,我们可以看到struts2使用了Common-FileUpload,Cos,Pell等组件构成上传的处理框架。
特别注意!在你写的Action中,三个参数的名字必须符合:
File文件:xxx
String 类型的FileName:xxxFileName
String类型的ContentType:xxxContentType
xxx必须一致!!
懒得手打了。转载链接:http://www.cnblogs.com/WJ-163/p/5946007.html
注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post
实现文件上传的Action类
//获取文件上传的保存路径 通过读取存放目录获得保存路径
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
在Action中使用了三个属性封装文件信息:
File类型的XXX属性,与表单的File控件的name属性一样,用于封装File控件对应的文件内容
String类型的xxxFileName属性,该属性名称由前面的File类型属性和FileName组合,是固定的语法,是封装File控件对应文件的文件名
String类型的XXXContentType属性,同样由xxx属性和ContentType组合而成,是固定语法,封装File控件对应文件的文件类型
配置Action:
上传成功后的结果页面:植入的value是Action类中所对应的实体类属性
实现效果:
与单文件上传的不同之处在于 将三个属性的类型修改成数组类型,并通过for循环进行遍历
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
实现效果:
为了支持文件的下载,Struts2框架提供了stream结果类型,该类型的作用就是专门用于实现文件下载的功能
实现文件下载:
由于在Struts2中实现文件下载时需要用到InputStream,所以在文件下载Action中要提供一个获得InputStream的方法,通过这个输入流将可以获取希望下载的文件内容
通过Context上下文得到下载文件的实际路径,并构建了一个InputStream输入流实现文件下载读取
Action配置:
在配置文件中,inputPath的param标签标示你要下载的文件的位置;
contentType参数决定了下载文件的类型。不同文件类型对应的参数值也是不同的。
inputName标示指定被下载文件的入口输入流,这和我们前面写的DownAction类的getInputStream()对应.
通常情况下,contentType参数直接设置为application/octet-stream即可
contentDispoistion参数由两个部分组成,前面的部分表示处理文件的形式,如attachement表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔
当单击超链接时,即可下载.下面的超链接中,down.action标示实现下载的action是down,?后面的名字标示我们下载的文件是1.png.
分为两种方式吧,一种手动方式实现过滤,一种配置struts.xml
先来看看各种文件类型:
查看文本打印
'.a' : 'application/octet-stream',
'.ai' : 'application/postscript',
'.aif' : 'audio/x-aiff',
'.aifc' : 'audio/x-aiff',
'.aiff' : 'audio/x-aiff',
'.au' : 'audio/basic',
'.avi' : 'video/x-msvideo',
'.bat' : 'text/plain',
'.bcpio' : 'application/x-bcpio',
'.bin' : 'application/octet-stream',
'.bmp' : 'image/x-ms-bmp',
'.c' : 'text/plain',
'.cdf' : 'application/x-cdf',
'.cdf' : 'application/x-netcdf',
'.cpio' : 'application/x-cpio',
'.csh' : 'application/x-csh',
'.css' : 'text/css',
'.dll' : 'application/octet-stream',
'.doc' : 'application/msword',
'.dot' : 'application/msword',
'.dvi' : 'application/x-dvi',
'.eml' : 'message/rfc822',
'.eps' : 'application/postscript',
'.etx' : 'text/x-setext',
'.exe' : 'application/octet-stream',
'.gif' : 'image/gif',
'.gtar' : 'application/x-gtar',
'.h' : 'text/plain',
'.hdf' : 'application/x-hdf',
'.htm' : 'text/html',
'.html' : 'text/html',
'.ief' : 'image/ief',
'.jpe' : 'image/jpeg',
'.jpeg' : 'image/jpeg',
'.jpg' : 'image/jpeg',
'.js' : 'application/x-javascript',
'.ksh' : 'text/plain',
'.latex' : 'application/x-latex',
'.m1v' : 'video/mpeg',
'.man' : 'application/x-troff-man',
'.me' : 'application/x-troff-me',
'.mht' : 'message/rfc822',
'.mhtml' : 'message/rfc822',
'.mif' : 'application/x-mif',
'.mov' : 'video/quicktime',
'.movie' : 'video/x-sgi-movie',
'.mp2' : 'audio/mpeg',
'.mp3' : 'audio/mpeg',
'.mpa' : 'video/mpeg',
'.mpe' : 'video/mpeg',
'.mpeg' : 'video/mpeg',
'.mpg' : 'video/mpeg',
'.ms' : 'application/x-troff-ms',
'.nc' : 'application/x-netcdf',
'.nws' : 'message/rfc822',
'.o' : 'application/octet-stream',
'.obj' : 'application/octet-stream',
'.oda' : 'application/oda',
'.p12' : 'application/x-pkcs12',
'.p7c' : 'application/pkcs7-mime',
'.pbm' : 'image/x-portable-bitmap',
'.pdf' : 'application/pdf',
'.pfx' : 'application/x-pkcs12',
'.pgm' : 'image/x-portable-graymap',
'.pl' : 'text/plain',
'.png' : 'image/png',
'.pnm' : 'image/x-portable-anymap',
'.pot' : 'application/vnd.ms-powerpoint',
'.ppa' : 'application/vnd.ms-powerpoint',
'.ppm' : 'image/x-portable-pixmap',
'.pps' : 'application/vnd.ms-powerpoint',
'.ppt' : 'application/vnd.ms-powerpoint',
'.ps' : 'application/postscript',
'.pwz' : 'application/vnd.ms-powerpoint',
'.py' : 'text/x-python',
'.pyc' : 'application/x-python-code',
'.pyo' : 'application/x-python-code',
'.qt' : 'video/quicktime',
'.ra' : 'audio/x-pn-realaudio',
'.ram' : 'application/x-pn-realaudio',
'.ras' : 'image/x-cmu-raster',
'.rdf' : 'application/xml',
'.rgb' : 'image/x-rgb',
'.roff' : 'application/x-troff',
'.rtx' : 'text/richtext',
'.sgm' : 'text/x-sgml',
'.sgml' : 'text/x-sgml',
'.sh' : 'application/x-sh',
'.shar' : 'application/x-shar',
'.snd' : 'audio/basic',
'.so' : 'application/octet-stream',
'.src' : 'application/x-wais-source',
'.sv4cpio': 'application/x-sv4cpio',
'.sv4crc' : 'application/x-sv4crc',
'.swf' : 'application/x-shockwave-flash',
'.t' : 'application/x-troff',
'.tar' : 'application/x-tar',
'.tcl' : 'application/x-tcl',
'.tex' : 'application/x-tex',
'.texi' : 'application/x-texinfo',
'.texinfo': 'application/x-texinfo',
'.tif' : 'image/tiff',
'.tiff' : 'image/tiff',
'.tr' : 'application/x-troff',
'.tsv' : 'text/tab-separated-values',
'.txt' : 'text/plain',
'.ustar' : 'application/x-ustar',
'.vcf' : 'text/x-vcard',
'.wav' : 'audio/x-wav',
'.wiz' : 'application/msword',
'.wsdl' : 'application/xml',
'.xbm' : 'image/x-xbitmap',
'.xlb' : 'application/vnd.ms-excel',
'.xls' : 'application/excel',
'.xls' : 'application/vnd.ms-excel',
'.xml' : 'text/xml',
'.xpdl' : 'application/xml',
'.xpm' : 'image/x-xpixmap',
'.xsl' : 'application/xml',
'.xwd' : 'image/x-xwindowdump',
'.zip' : 'application/zip',
s2:在struts.xml文件中配置一个参数,这个参数是允许的文件类型。如下:
s3:在对应的UploadAction中,定义和参数同名的属性,为allowType,增加get和set方法
s4:在UploadAction编写validate()函数,调用前面的filterTypes()函数
配置FileUpload的时候,可以为其制定两个参数:
allowTypes:该参数允许上传的文件类型,多个文件类型之间用英文逗号(,)隔开
maximumSize:该参数允许上传的文件大小,单位是字节
下面上一个简单的例子。
特别注意!在你写的Action中,三个参数的名字必须符合:
File文件:xxx
String 类型的FileName:xxxFileName
String类型的ContentType:xxxContentType
xxx必须一致!!
懒得手打了。转载链接:http://www.cnblogs.com/WJ-163/p/5946007.html
单文件上传
一、要实现文件上传,需在项目中添加两个jar文件
二、上传准备的页面
注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post<h2>单个文件上传</h2> <s:form action="upload.action" enctype="multipart/form-data" method="post"> <s:textfield name="title" label="标题"/> <s:file name="upload" label="选择文件"/><br/> <s:submit name="submit" value="上传文件"></s:submit> </s:form>
实现文件上传的Action类
public class UploadAction extends ActionSupport{ //封装上传文件属性 private File upload; //封装上传文件的类型 private String uploadContentType; //封装上传文件名称 private String uploadFileName; //获取文件上传的路径 private String savePath; @Override public String execute() throws Exception { byte[] buffer=new byte[1024]; //读取文件 FileInputStream fis=new FileInputStream(getUpload()); //保存文件 FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName()); int length=fis.read(buffer); while(length>0){ //每次写入length长度的内容 fos.write(buffer,0,length); length=fis.read(buffer); } fis.close(); fos.flush(); fos.close(); return SUCCESS; }
//获取文件上传的保存路径 通过读取存放目录获得保存路径
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
在Action中使用了三个属性封装文件信息:
File类型的XXX属性,与表单的File控件的name属性一样,用于封装File控件对应的文件内容
String类型的xxxFileName属性,该属性名称由前面的File类型属性和FileName组合,是固定的语法,是封装File控件对应文件的文件名
String类型的XXXContentType属性,同样由xxx属性和ContentType组合而成,是固定语法,封装File控件对应文件的文件类型
配置Action:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 文件上传 --> <action name="upload" class="cn.happy.action.UploadAction"> <!-- 通过param参数设置保存目录的路径 --> <param name="savePath">/upload</param> <result name="success">ok.jsp</result> </action> </package> </struts>
上传成功后的结果页面:植入的value是Action类中所对应的实体类属性
您所上传的文件是:<s:property value="uploadFileName"/><br/> 文件类型:<s:property value="uploadContentType"/>
实现效果:
多文件上传
与单文件上传的不同之处在于 将三个属性的类型修改成数组类型,并通过for循环进行遍历public class SomeUploadAction extends ActionSupport { // 封装上传文件属性 private File[] upload; // 封装上传文件的类型 private String[] uploadContentType; // 封装上传文件名称 private String[] uploadFileName; // 封装文件上传的路径 private String savePath; public String execute() throws Exception { byte[] buffer = new byte[1024]; for (int i = 0; i < upload.length; i++) { FileInputStream fis = new FileInputStream(getUpload()[i]); FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + this.getUploadFileName()[i]); int length = fis.read(buffer); while (length > 0) { fos.write(buffer, 0, length); length = fis.read(buffer); } fos.flush(); fos.close(); fis.close(); } return SUCCESS; }
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
实现效果:
实现文件下载
为了支持文件的下载,Struts2框架提供了stream结果类型,该类型的作用就是专门用于实现文件下载的功能实现文件下载:
由于在Struts2中实现文件下载时需要用到InputStream,所以在文件下载Action中要提供一个获得InputStream的方法,通过这个输入流将可以获取希望下载的文件内容
public class DownAction extends ActionSupport{ //读取下载文件的目录 private String inputPath; //下载文件的文件名 private String fileName; //读取下载文件的输入流 private InputStream inputStream; //下载文件的类型 private String conetntType; @Override public String execute() throws Exception { return SUCCESS; } //创建InputStream输入流 public InputStream getInputStream() throws FileNotFoundException { //String path=ServletActionContext.getServletContext().getRealPath(inputPath); return new BufferedInputStream(new FileInputStream(inputPath+"\\"+fileName)); }
通过Context上下文得到下载文件的实际路径,并构建了一个InputStream输入流实现文件下载读取
Action配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 文件下载 --> <action name="down" class="cn.happy.action.DownAction"> <param name="inputPath">/image</param> <result name="success" type="stream"> <param name="contentType">application/octet-stream</param> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment;filename="${fileName}"</param> <param name="bufferSize">4096</param> </result> </action> </package> </struts>
在配置文件中,inputPath的param标签标示你要下载的文件的位置;
contentType参数决定了下载文件的类型。不同文件类型对应的参数值也是不同的。
inputName标示指定被下载文件的入口输入流,这和我们前面写的DownAction类的getInputStream()对应.
通常情况下,contentType参数直接设置为application/octet-stream即可
contentDispoistion参数由两个部分组成,前面的部分表示处理文件的形式,如attachement表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔
当单击超链接时,即可下载.下面的超链接中,down.action标示实现下载的action是down,?后面的名字标示我们下载的文件是1.png.
文件上传过滤!
分为两种方式吧,一种手动方式实现过滤,一种配置struts.xml先来看看各种文件类型:
查看文本打印
'.a' : 'application/octet-stream',
'.ai' : 'application/postscript',
'.aif' : 'audio/x-aiff',
'.aifc' : 'audio/x-aiff',
'.aiff' : 'audio/x-aiff',
'.au' : 'audio/basic',
'.avi' : 'video/x-msvideo',
'.bat' : 'text/plain',
'.bcpio' : 'application/x-bcpio',
'.bin' : 'application/octet-stream',
'.bmp' : 'image/x-ms-bmp',
'.c' : 'text/plain',
'.cdf' : 'application/x-cdf',
'.cdf' : 'application/x-netcdf',
'.cpio' : 'application/x-cpio',
'.csh' : 'application/x-csh',
'.css' : 'text/css',
'.dll' : 'application/octet-stream',
'.doc' : 'application/msword',
'.dot' : 'application/msword',
'.dvi' : 'application/x-dvi',
'.eml' : 'message/rfc822',
'.eps' : 'application/postscript',
'.etx' : 'text/x-setext',
'.exe' : 'application/octet-stream',
'.gif' : 'image/gif',
'.gtar' : 'application/x-gtar',
'.h' : 'text/plain',
'.hdf' : 'application/x-hdf',
'.htm' : 'text/html',
'.html' : 'text/html',
'.ief' : 'image/ief',
'.jpe' : 'image/jpeg',
'.jpeg' : 'image/jpeg',
'.jpg' : 'image/jpeg',
'.js' : 'application/x-javascript',
'.ksh' : 'text/plain',
'.latex' : 'application/x-latex',
'.m1v' : 'video/mpeg',
'.man' : 'application/x-troff-man',
'.me' : 'application/x-troff-me',
'.mht' : 'message/rfc822',
'.mhtml' : 'message/rfc822',
'.mif' : 'application/x-mif',
'.mov' : 'video/quicktime',
'.movie' : 'video/x-sgi-movie',
'.mp2' : 'audio/mpeg',
'.mp3' : 'audio/mpeg',
'.mpa' : 'video/mpeg',
'.mpe' : 'video/mpeg',
'.mpeg' : 'video/mpeg',
'.mpg' : 'video/mpeg',
'.ms' : 'application/x-troff-ms',
'.nc' : 'application/x-netcdf',
'.nws' : 'message/rfc822',
'.o' : 'application/octet-stream',
'.obj' : 'application/octet-stream',
'.oda' : 'application/oda',
'.p12' : 'application/x-pkcs12',
'.p7c' : 'application/pkcs7-mime',
'.pbm' : 'image/x-portable-bitmap',
'.pdf' : 'application/pdf',
'.pfx' : 'application/x-pkcs12',
'.pgm' : 'image/x-portable-graymap',
'.pl' : 'text/plain',
'.png' : 'image/png',
'.pnm' : 'image/x-portable-anymap',
'.pot' : 'application/vnd.ms-powerpoint',
'.ppa' : 'application/vnd.ms-powerpoint',
'.ppm' : 'image/x-portable-pixmap',
'.pps' : 'application/vnd.ms-powerpoint',
'.ppt' : 'application/vnd.ms-powerpoint',
'.ps' : 'application/postscript',
'.pwz' : 'application/vnd.ms-powerpoint',
'.py' : 'text/x-python',
'.pyc' : 'application/x-python-code',
'.pyo' : 'application/x-python-code',
'.qt' : 'video/quicktime',
'.ra' : 'audio/x-pn-realaudio',
'.ram' : 'application/x-pn-realaudio',
'.ras' : 'image/x-cmu-raster',
'.rdf' : 'application/xml',
'.rgb' : 'image/x-rgb',
'.roff' : 'application/x-troff',
'.rtx' : 'text/richtext',
'.sgm' : 'text/x-sgml',
'.sgml' : 'text/x-sgml',
'.sh' : 'application/x-sh',
'.shar' : 'application/x-shar',
'.snd' : 'audio/basic',
'.so' : 'application/octet-stream',
'.src' : 'application/x-wais-source',
'.sv4cpio': 'application/x-sv4cpio',
'.sv4crc' : 'application/x-sv4crc',
'.swf' : 'application/x-shockwave-flash',
'.t' : 'application/x-troff',
'.tar' : 'application/x-tar',
'.tcl' : 'application/x-tcl',
'.tex' : 'application/x-tex',
'.texi' : 'application/x-texinfo',
'.texinfo': 'application/x-texinfo',
'.tif' : 'image/tiff',
'.tiff' : 'image/tiff',
'.tr' : 'application/x-troff',
'.tsv' : 'text/tab-separated-values',
'.txt' : 'text/plain',
'.ustar' : 'application/x-ustar',
'.vcf' : 'text/x-vcard',
'.wav' : 'audio/x-wav',
'.wiz' : 'application/msword',
'.wsdl' : 'application/xml',
'.xbm' : 'image/x-xbitmap',
'.xlb' : 'application/vnd.ms-excel',
'.xls' : 'application/excel',
'.xls' : 'application/vnd.ms-excel',
'.xml' : 'text/xml',
'.xpdl' : 'application/xml',
'.xpm' : 'image/x-xpixmap',
'.xsl' : 'application/xml',
'.xwd' : 'image/x-xwindowdump',
'.zip' : 'application/zip',
手动实现文件过滤
s1:在对应的UploadAction中定义一个类型过滤方法,这个方法的名字任意,只需要在后面的validate()方法调用即可,方法内容是传入一个类型数组,比较当前的文件类型(xxxContentType)是否与类型数组的某个类型一致,见下表:public String filterTypes(String[] types){ String fileType= getUploadContentType(); for(String type:types){ System.out.println(type); if(type.equals(fileType)){ return null; } } return ERROR; }
s2:在struts.xml文件中配置一个参数,这个参数是允许的文件类型。如下:
<package name="upload" extends="struts-default"> <action name="uploadAction" class="cn.nju.fxd.action.UploadAction"> <param name="savePath">/upload</param> <param name="allowType">image/png,image/gif,image/jpeg</param> <result>/uploadSucc.jsp</result> <result name="input">/upload.jsp</result> </action> </package>
s3:在对应的UploadAction中,定义和参数同名的属性,为allowType,增加get和set方法
s4:在UploadAction编写validate()函数,调用前面的filterTypes()函数
public void validate(){ //调用fiterTypes函数 //allowType分解为数组,因为fiterTypes函数接受的参数是数组 String filterResult=filterTypes(getAllowType().split(",")); if(filterResult!=null){ addFieldError("upload", "Sorry,errorType"); } }s5:运行检验成果,
拦截器实现文件过滤:
Struts2提供了一个文件上传拦截器,通过配置该拦截器可以轻松的实现文件过滤。Struts2中文件上传的拦截器是fileUpload,为了让该拦截器起作用,只需要在该Action中配置该拦截器引用即可。配置FileUpload的时候,可以为其制定两个参数:
allowTypes:该参数允许上传的文件类型,多个文件类型之间用英文逗号(,)隔开
maximumSize:该参数允许上传的文件大小,单位是字节
下面上一个简单的例子。
<package name="upload" extends="struts-default"> <action name="uploadAction" class="cn.nju.fxd.action.UploadAction"> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/gif,image/jpeg</param> <param name="maximumSize">2000</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> <param name="savePath">/upload</param> <param name="allowType">image/png,image/gif,image/jpeg</param> <result>/uploadSucc.jsp</result> <result name="input">/upload.jsp</result> </action> </package>如果需要使用非默认拦截器,必须显示的配置引用默认拦截器defaultStack,不然会报错!这一点非常重要!
相关文章推荐
- Struts2 控制文件上传下载
- Struts2 控制文件上传下载功能实例代码
- Struts2 控制文件上传下载
- 【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【控制文件上传和下载】
- 使用struts2进行文件下载以及下载权限控制的例子
- struts2实现上传下载(单文件上传与多文件上传的比较)
- struts2文件上传和下载
- struts2 文件上传下载
- Java程序员从笨鸟到菜鸟之(七十一)细谈struts2(十三)struts2实现文件上传和下载详解
- Struts2自学入门(十)——多文件上传及文件下载
- 框架(一)struts2——文件上传与下载
- struts2中的文件上传下载
- 文件下载 上传ext4.0.7+struts2
- struts2的文件上传和文件下载
- 使用Struts2实现文件的上传与动态下载(2)
- struts2文件上传下载(含中文编码问题)
- Struts2学习(八)—文件上传和下载
- 【Struts2】【文件的上传和下载】【fileUpload拦截器】
- 【Struts2】4.文件上传与下载
- Struts2 框架实现多文件上传下载