Struts2第六篇【文件上传和下载】
来源:互联网 发布:国元 8月宏观数据点评 编辑:程序博客网 时间:2024/06/16 10:01
前言
在讲解开山篇的时候就已经说了,Struts2框架封装了文件上传的功能……..本博文主要讲解怎么使用Struts框架来完成文件上传和下载
回顾以前的文件上传
首先,我们先来回顾一下以前,我们在web中上传文件是怎么做的….http://blog.csdn.net/hon_3y/article/details/66975268
可以使用FileUpload或者SmartUpload组件来完成文件上传的功能。但是呢,FileUpload组件使用起来是比较麻烦的…而SmartUPload解决中文的问题也非常麻烦
使用Struts进行文件上传
从要导入的jar包我们就可以知道:Struts内部还是使用fileUpload上传组件….但是它极大的简化地我们的具体操作
那我们怎么用它呢??看下面的图
- 在Action中使用在表单中定义的name,就可以获取代表的上传文件的File对象
- 在Action中使用在表单中定义的name+FileName,就得到上传文件的名字
JSP页面
在注册页面上拥有两个上传文件控件
<form action="${pageContext.request.contextPath}/register" method="post" enctype="multipart/form-data"> <input type="file" name="photo"><br> <input type="file" name="photo1"><br> <input type="submit" value="注册"><br></form>
Action
得到相对应的File对象、上传文件名称、上传文件的类型
package fileupload;import java.io.File;/** * Created by ozc on 2017/5/2. */public class FileUploadAction { //上传文件对应的File对象 private File photo; private File photo1; //得到上传文件的名称 private String photoFileName; private String photo1FileName; //得到上传文件的类型 private String photoContentType; private String photo1ContentType; //给出相对应的setter public void setPhoto(File photo) { this.photo = photo; } public void setPhoto1(File photo1) { this.photo1 = photo1; } public void setPhotoFileName(String photoFileName) { this.photoFileName = photoFileName; } public void setPhoto1FileName(String photo1FileName) { this.photo1FileName = photo1FileName; } public void setPhotoContentType(String photoContentType) { this.photoContentType = photoContentType; } public void setPhoto1ContentType(String photo1ContentType) { this.photo1ContentType = photo1ContentType; } public String register() { System.out.println(photo1FileName); System.out.println(photoFileName); return "success"; }}
成功得到数据:
Action业务代码:
public String register() throws IOException { //得到上传的路径 String path = ServletActionContext.getServletContext().getRealPath("upload"); System.out.println(path); //创建文件对象 File destFile = new File(path,photoFileName); //调用工具类方法,将文件拷贝过去 FileUtils.copyFile(photo, destFile); return "success"; }
- 效果:
文件下载
我们以前是通过设置request消息头来实现文件下载的…..那么在Struts又如何实现文件下载呢??
我们请求服务器处理都是通过Action类来完成的,但是呢,Action类的业务方法都是返回字符串。因此,Struts在<result>
节点中提供了类型为stream的type值。通过stream来配置相对应的信息,从而实现下载!
列出所有可以下载的文件
- Action类的业务方法
public class downLoadAction { //列出所有可以下载的文件 public String list() { //得到upload文件夹 String path = ServletActionContext.getServletContext().getRealPath("/upload"); //创建file对象 File file = new File(path); //列出文件下所有的文件 File[] files = file.listFiles(); //将这些文件存到request域中 HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("files", files); return "list"; }}
- Struts配置文件
<action name="down_*" class="fileupload.downLoadAction" method="{1}"> <result name="{1}">/list.jsp</result> <!-- <result name="{1}" type="stream">/index.jsp</result>--> </action>
- JSP显示页面
<c:if test="${files==null}"> 对不起,没有下载的页面</c:if><c:if test="${files!=null}"> <table border="1px"> <tr> <td>编号</td> <td>文件名称</td> <td>操作</td> </tr> <c:forEach items="${files}" varStatus="file" var="fileName"> <tr> <td>${file.count}</td> <%--如果直接写fileName,输出的名字带有路径,使用EL方法库来截取--%> <td>${fn:substringAfter(fileName, "upload\\")}</td> <td> <%--使用url标签来构建url,不然超链接带有中文,会出现乱码--%> <c:url var="url" value="down_downLoad"> <c:param name="fileName">${fn:substringAfter(fileName, "upload\\")}</c:param> </c:url> <a href="${url}">下载</a> </td> </tr> </c:forEach> </table></c:if>
- Action代码:
/** * 访问Action的业务方法仅仅返回的是字符串。因此Struts在result节点提供了stream类型的type, * 指定了stream就代表着我这是要下载的... * <p> * 既然要下载文件,那么肯定需要几样东西: * 1、文件名 * 2、代表文件的流 */ public String downLoad() { return "downLoad"; } //得到要下载的文件名,Struts提供了自动封装的功能 private String fileName; //如果文件名是中文的,那么需要手动转换,因为超链接是get方法提交 public void setFileName(String fileName) throws UnsupportedEncodingException { fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8"); this.fileName = fileName; System.out.println(fileName); } //得到代表下载文件流,该方法由Struts调用 public InputStream getAttrInputStream() { return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName); } //下载时,显示的名称【如果是中文,可能会乱码,因此要URLencode】---->在Struts.xml文件中通过${}可获取 public String getDownFileName() throws UnsupportedEncodingException { fileName = URLEncoder.encode(fileName, "UTF-8"); return fileName; }
- Struts.xml
<action name="down_*" class="fileupload.downLoadAction" method="{1}"> <result name="{1}">/list.jsp</result> <result name="downLoad" type="stream"> <!--运行下载的类型,指定为所有的二进制文件--> <param name="contentType">application/octet-stream</param> <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 --> <param name="inputName">attrInputStream</param> <!-- 下载头,包括:浏览器显示的文件名 --> <!--${}这里不是EL表达式--> <param name="contentDisposition">attachment;filename=${downFileName}</param> <!-- 缓冲区大小设置 --> <param name="bufferSize">1024</param> </result> </action>
效果
1 0
- Struts2第六篇【文件上传和下载】
- Struts2文件上传和下载
- struts2文件上传和下载
- struts2文件上传和下载
- struts2 文件上传和下载
- struts2文件上传和下载
- Struts2文件上传和下载
- struts2上传和下载文件
- struts2 文件上传和下载
- Struts2文件上传和下载
- Struts2文件上传和下载
- struts2文件上传和下载
- Struts2文件上传和下载
- Struts2文件上传和下载
- struts2文件上传和下载
- struts2文件上传和下载
- struts2文件上传和下载
- [Struts2] 文件上传和下载
- java程序运行机制
- Problem D: 平面上的点和线——Point类、Line类 (IV)
- RxSwift(3.4.1)- Combining Operators
- HTTP协议post请求返回json数据
- mac 环境下 LuaJit 执行报错 : unknown luaJIT command or jit.* modules not installed
- Struts2第六篇【文件上传和下载】
- Mysql优化
- Problem E: 平面上的点和线——Point类、Line类 (V)
- 调整堆的程序
- 详解web.xml 中的listener、 filter、servlet 加载顺序
- javaweb之旅感慨
- Angular快速入门--路由篇
- cv2.imread()和caffe.io.loadimage的区别
- 谈谈“搜索”,2种场景下的最优解