Struts2(三)使用Struts2实现文件的上传和下载

        文件上传是我们在实际开发中经常遇到的一个问题,曾经使用commons-fileupload组件实现过文件上传下载;同样的,Struts2也可以实现文件上传下载,并且操作起来更加简单(以下只是一个简单的Demo,并不包含文件类型、大小判断等问题)。

一、文件上传

1.单文件上传

         ①创建web项目FileUpDownloadDemo,并添加Struts2框架支持,创建upload.jsp,并准备好表单,如下:
  1. <!--  
  2.     准备好表单,当然我这里使用的是Struts2的标签,也可以使用input等普通标签,注意:  
  3.     method:当然一定是post方式  
  4.     enctyppe:使用的是 multipart/form-data方式  
  5.  -->  
  6.  <s:form action="upload" method="post" enctype="multipart/form-data">  
  7.     <s:textfield name="title" label="请选择文件"/>  
  8.     <s:file name="file" label="选择文件"/>  
  9.     <s:submit value="上传"/>  
  10.  </s:form>  
②编写创建FileUploadAction类,继承ActionSupport
  1. package com.wzj.action;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8.   
  9. import org.apache.struts2.ServletActionContext;  
  10.   
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.   
  13. public class FileUploadAction extends ActionSupport {  
  14.     //定义一个File类型的属性,属性名称和表单元素中file标签的name属性值一致  
  15.     private File file;  
  16.     //定义一个String型的xxxContentType,固定写法,前缀是上面属性的名字  
  17.     private String fileContentType;  
  18.     //定义一个String的xxxFileName,固定写法,前缀同上  
  19.     private String fileFileName;  
  20.     //此属性和struts.xml文件action中的param元素对应  
  21.     private String savePath;  
  22.   
  23.   
  24.     /** 
  25.      * 处理上传文件请求 
  26.      * @return 
  27.      */  
  28.     public String upload(){  
  29.         FileInputStream fis=null;  
  30.         FileOutputStream fos=null;  
  31.         try {  
  32.             //为file属性提供好get、set方法后Struts2会自动将文件映射 到file属性值中,  
  33.             fis=new FileInputStream(getFile());  
  34.             fos=new FileOutputStream(getSavePath()+"\\"+getFileFileName());  
  35.             //创建缓冲区  
  36.             byte[] buf=new byte[fis.available()];  
  37.             //读写文件  
  38.             fis.read(buf);  
  39.             fos.write(buf);  
  40.             fos.flush();  
  41.             return SUCCESS;  
  42.         } catch (FileNotFoundException e) {  
  43.             e.printStackTrace();  
  44.             return ERROR;  
  45.         } catch (IOException e) {  
  46.             e.printStackTrace();  
  47.             return ERROR;  
  48.         }finally{  
  49.             try {  
  50.                 fis.close();  
  51.                 fos.close();  
  52.             } catch (IOException e) {  
  53.                 e.printStackTrace();  
  54.             }  
  55.         }  
  56.     }  
  57.   
  58.     public String getSavePath() {  
  59.         //对路径做了下封装,表示服务器本地磁盘的实际保存位置  
  60.         return ServletActionContext.getServletContext().getRealPath(savePath);  
  61.     }  
  62.     //省略其他get、set方法  
  63. }  
③在struts.xml文件中配置action
  1. <action name="upload" class="com.wzj.action.FileUploadAction" method="upload">  
  2.         <!--  
  3.             注意此处使用param元素向action类中传递参数,即FileUploadAction类中的  
  4.             savePath属性,注意:name值要和属性名字保持一致!  
  5.           -->  
  6.         <param name="savePath">/uploadFiles</param>  
  7.         <result name="success">/success.jsp</result>  
  8.         <result name="error">/error.jsp</result>  
  9.     </action>  
④运行项目,选择文件上传后,文件便出现在Tomcat目录下项目的uploadFiles目录下。
总结:
文件上传的核心在于action类的编写,注意在Action中定义了几个属性来封装文件信息:
a.File类型的xxx——封装上传的文件,与表单中FIle控件中的name属性值保持一致
b.String类型的xxxFileName——封装文件的名称(含后缀名),xxx就是表单中File控件的name属性值,FileName是固定写法
c.String类型的xxxContentType——封装文件的类型,xxx同上,ContentType为固定写法
提交表单后框架会自动帮助我们把文件映射到Action类中。

2.多文件上传

多文件上传的基本步骤同单文件上传的步骤类似,只不过将Action类中的属性定义为数组的形式,即如:
  1. private File[] file;  
  2.     private String[] fileFileName;  
  3.     private String[] fileContentType;  
  4.     //....  
当然也可以使用在表单中声明多个控件的方式,但是这种方式会造成Action类中的属性冗余,不建议使用。

二、文件下载

        相对于文件上传来说,文件下载更为简单,Struts2通过stream结果类型来实现下载功能,在Action类中只需要指定一个获得inputStream输入流的方法,通过这个输入流就可以向外输出文件内容。当然,还得需要对相关参数进行配置。stream结果类型有以下几个参数:

stream结果类型的配置参数
名称作用
contentType设置发送到浏览器的MIME类型
contentLength设置文件的大小
contentDisposition设置响应的头信息中的Content-Disposition参数的值
inputName指定Action中提供的inputStream类型的属性名称
bufferSizes设置读取和下载文件时缓冲区的大小


contentType的类型有:

contentType对应的文件类型
文件类型contentType设置
Wordapplication/msword
ExcelApplication/vnd.ms-excel
PPTApplication/vnd.ms-powerpoint
图片image/gif、image/bmp、image/jpeg
文本文件text/plain
HTML网页text/html
可执行文件application/octet-stream

        ①创建download.jsp,并简单书写一个超链接

  1. <a href="download?name=test.png">点击我下载测试文件</a>  
②创建FileDownloadAction类:
  1. package com.wzj.action;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.InputStream;  
  7.   
  8. import org.apache.struts2.ServletActionContext;  
  9.   
  10. import com.opensymphony.xwork2.ActionSupport;  
  11.   
  12. public class FileDownloadAction extends ActionSupport {  
  13.       
  14.     //下载文件中的名称,从url参数中获取  
  15.     private String name;  
  16.     //下载文件保存在服务器端的路径  
  17.     private String inputPath;  
  18.     //下载文件的类型  
  19.     private String contentType;  
  20.     //读取下载文件的输入流  
  21.     private InputStream inputStream;  
  22.       
  23.       
  24.     public String execute(){  
  25.         return SUCCESS;  
  26.     }  
  27.       
  28.     public InputStream getInputStream() throws FileNotFoundException {  
  29.         String path=ServletActionContext.getServletContext().getRealPath(inputPath);  
  30.         return new BufferedInputStream(new FileInputStream(path+"\\"+name));  
  31.     }  
  32.       
  33.     //省略其他get、set方法   
  34. }  
③对action进行配置:
  1. <action name="download" class="com.wzj.action.FileDownloadAction">  
  2.     <param name="inputPath">/uploadFiles</param>  
  3.     <result name="success" type="stream">  
  4.         /success.jsp  
  5.         <!-- 注意需要配置以下参数 -->  
  6.         <param name="contentType">application/octet-stream</param>  
  7.         <param name="inputName">inputStream</param>  
  8.         <param name="contentDisposition">attachment;filename="${name}"</param>  
  9.         <param name="bufferSize">4096</param>  
  10.     </result>  
  11. </action>  

④运行,点击链接,将会出现下面的窗口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值