Strusts2笔记8--文件的上传和下载
文件的和上传和下载:
(1)文件的上传:
Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的commons-fileupload完成的。
我们要做的,就是将上传好的文件放到指定的位置或者其他的一些处理。
前端表单提交的代码:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 3 <html> 4 <head> 5 <title>index page</title> 6 </head> 7 8 <body> 9 <form action="test/upload.action" method="POST" enctype="multipart/form-data"> 10 文件:<input type="file" name="img"/><br> 11 <input type="submit" value="上传"/> 12 </form> 13 </body> 14 </html>
Action代码:
1 package com.tongji.actions; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import org.apache.commons.io.FileUtils; 7 import org.apache.struts2.ServletActionContext; 8 9 public class UploadAction { 10 private File img; 11 private String imgFileName; //文件名 = 文件 + FileName , 必须是这样 12 13 public File getImg() { 14 return img; 15 } 16 17 public void setImg(File img) { 18 this.img = img; 19 } 20 21 public String getImgFileName() { 22 return imgFileName; 23 } 24 25 public void setImgFileName(String imgFileName) { 26 this.imgFileName = imgFileName; 27 } 28 29 public String execute() throws IOException { 30 if (img != null) { 31 //String path = "d:/images"; 32 String path = ServletActionContext.getServletContext().getRealPath("/images"); 33 File destFile = new File(path,imgFileName); 34 FileUtils.copyFile(img, destFile); 35 return "success"; 36 } 37 return "message"; 38 } 39 40 }
注意:第32行,不能像31行那样直接写文件要被拷贝到的路径。因为,不能让前端代码操纵后端服务器的盘符,前端代码能够操作的只能是对应项目的所在空间(tomcat目录下的项目的空间)。
struts.xml配置文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <constant name="struts.multipart.maxSize" value="20971520"/> <!-- 改变可上传文件的大小 --> 7 <package name="demo" namespace="/test" extends="struts-default"> 8 <action name="upload" class="com.tongji.actions.UploadAction"> 9 <result>/welcome.jsp</result> 10 <result name="message">/messge.jsp</result> <!-- 处理上传失败异常 --> 11 <interceptor-ref name="defaultStack"> <!-- 设置可上传文件的拓展名 --> 12 <param name="fileUpload.allowedExtensions">jpg,png</param> 13 </interceptor-ref> 14 </action> 15 </package> 16 </struts>
注意:以上的注释内容。
(2)多文件的上传:
前端表单提交的代码:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 3 <html> 4 <head> 5 <title>index page</title> 6 </head> 7 8 <body> 9 <form action="test/upload.action" method="POST" enctype="multipart/form-data"> 10 文件1:<input type="file" name="imgs"/><br> 11 文件2:<input type="file" name="imgs"/><br> 12 文件3:<input type="file" name="imgs"/><br> 13 <input type="submit" value="上传"/> 14 </form> 15 </body> 16 </html>
Action代码:
1 package com.tongji.actions; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import org.apache.commons.io.FileUtils; 7 import org.apache.struts2.ServletActionContext; 8 9 public class UploadAction { 10 private File[] imgs; 11 private String[] imgsFileName; //文件名 = 文件 + FileName , 必须是这样 12 13 public File[] getImgs() { 14 return imgs; 15 } 16 17 public void setImgs(File[] imgs) { 18 this.imgs = imgs; 19 } 20 21 public String[] getImgsFileName() { 22 return imgsFileName; 23 } 24 25 public void setImgsFileName(String[] imgsFileName) { 26 this.imgsFileName = imgsFileName; 27 } 28 29 public String execute() throws IOException { 30 //若没有选择要上传的文件,则该数组不进行创建,而非创建了长度为0的数组对象 31 if (imgs != null) { 32 String path = ServletActionContext.getServletContext().getRealPath("/images"); 33 for (int i = 0; i < imgs.length; i++) { 34 File destFile = new File(path, imgsFileName[i]); 35 FileUtils.copyFile(imgs[i], destFile); 36 } 37 return "success"; 38 } 39 return "message"; 40 } 41 42 }
补充:<constant name="struts.multipart.maxSize" value="20971520"/> <!-- 改变可上传文件的大小 -->,在多文件上传时,指的是多文件上传的总大小
(3)文件的下载:
服务端向客户端浏览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示;如果需要用户以附件的形式保存,则称为文件下载。
如果需要向浏览器提供文件下载功能,则需要设置HTTP响应头的Content-Disposition属性,即内容配置属性值为attachment(附件)。
Action类中需要提供两个属性,一个为文件输入流,用于指定服务器向客户端所提供下载的文件资源;一个为文件名,即用户要下载的资源文件名。
前端页面代码:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 3 <html> 4 <head> 5 <title>index page</title> 6 </head> 7 8 <body> 9 <a href="test/download.action">美图</a> 10 </body> 11 </html>
Action代码:
1 package com.tongji.actions; 2 3 import java.io.InputStream; 4 5 import org.apache.struts2.ServletActionContext; 6 7 public class DownloadAction { 8 private InputStream is; 9 private String fileName; //随意 10 11 public InputStream getIs() { 12 return is; 13 } 14 15 public void setIs(InputStream is) { 16 this.is = is; 17 } 18 19 public String getFileName() { 20 return fileName; 21 } 22 23 public void setFileName(String fileName) { 24 this.fileName = fileName; 25 } 26 27 public String execute() throws Exception { 28 fileName = "5.jpg"; 29 30 fileName = "书言.jpg"; 31 is = ServletActionContext.getServletContext().getResourceAsStream("/images/" + fileName); 32 33 byte[] bytes = fileName.getBytes("utf-8"); 34 fileName = new String(bytes, "iso-8859-1"); 35 36 return "success"; 37 } 38 39 }
解释:第33行是为了解决中文乱码的问题,因为代码是utf-8格式的,而前端页面是iso-8859-1格式的。
struts.xml配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <package name="demo" namespace="/test" extends="struts-default"> 7 <action name="download" class="com.tongji.actions.DownloadAction"> 8 <result type="stream"> 9 <param name="inputName">is</param> 10 <param name="contentDisposition">attachment;filename=${fileName}</param> 11 </result> 12 </action> 13 </package> 14 </struts>
解释:返回类型是stream,并且要指定inputName(用于指定服务器向客户端所提供下载的文件资源),以及需要设置HTTP响应头的Content-Disposition属性,即配置attachment和文件名。
如果Action中的InputStream属性值为inputStream,则不需要配置<param name="inputName">is</param>,因为InputStream默认值就为inputStream。