您的位置:首页 > 编程语言 > Java开发

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

单文件上传


一、要实现文件上传,需在项目中添加两个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.0