struts2控制文件上传和下载
来源:互联网 发布:淘宝厂家直销违规吗 编辑:程序博客网 时间:2024/05/01 23:34
为了能上传文件,我们必须将表单的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
单文件上传
一、要实现文件上传,需在项目中添加两个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:运行检验成果,
拦截器实现文件过滤:
<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文件上传和下载
- struts2文件上传和下载
- struts2 文件上传和下载
- struts2文件上传和下载
- Struts2文件上传和下载
- struts2上传和下载文件
- struts2 文件上传和下载
- Struts2文件上传和下载
- Struts2文件上传和下载
- struts2文件上传和下载
- Struts2文件上传和下载
- Struts2文件上传和下载
- struts2文件上传和下载
- struts2文件上传和下载
- struts2文件上传和下载
- [Struts2] 文件上传和下载
- 设计模式--代理模式
- 面试中的html doctype到底是什
- Django学习笔记
- HDU 6011 Lotus and Characters
- 概率论(一)
- struts2控制文件上传和下载
- 【lintcode笔记】合并排序数组
- python+ffmpeg截取视频段
- 杨辉三角形
- 使用Maven来创建管理web项目
- 需要做的事
- C# 6 与 .NET Core 1.0 高级编程
- Android中的权限问题
- 关于 iOS 10 中 ATS 的问题