Struts2框架使用(十)之struts2的上传和下载
Struts2 文件上传
首先是Struts2的上传,Struts2 文件上传是基于 Struts2 拦截器实现的,使用的是fileupload组件;
首先如果想要上传文件,则需要在表单处添加 enctype="multipart/form-data" 属性。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>文件上传</h1> <s:fielderror></s:fielderror> <form action="upload" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name" /> 文件:<input type="file" name="java1234"/><br/> <input type="submit" value="提交"/> </form> <h1>多文件上传</h1> <s:fielderror></s:fielderror> <form action="uploads" method="post" enctype="multipart/form-data"> 文件1:<input type="file" name="java1234"/><br/> 文件2:<input type="file" name="java1234"/><br/> 文件3:<input type="file" name="java1234"/><br/> <input type="submit" value="提交"/> </form> </body> </html>
然后在Action中获取数据需要按照一定格式来获取:
Struts2 获取上传文件:name (name 是文件表单的 name)
Struts2 获取上传文件名:name+FileName;
Struts2 获取上传文件的类型:name+ContentType;
import java.io.File; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport{ /** * 文件上传 */ private static final long serialVersionUID = 1L; private File java1234; // 文件 private String java1234FileName; // 文件名 private String java1234ContentType; // 文件类型 private String name; @Override public String execute() throws Exception { System.out.println("name=" + name); System.out.println("文件名:"+java1234FileName); System.out.println("文件类型:"+java1234ContentType); //这里写的是存储路径 String filePath="C:/"+java1234FileName; //根据路径创建一个文件 File saveFile=new File(filePath); //将上传得到文件流复制到路径所创建的文件上 FileUtils.copyFile(java1234, saveFile); return SUCCESS; }
之后再struts.xml文件中配置Action即可,注意:这里的校验,是先校验package外的最大大小,一旦超过则抛出异常,不会进入到action中。
通过package外最大文件上传校验后,进入到action内部的拦截器校验时,一旦拦截,则会返回个input字段。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- Struts2 最大文件上传大小默认是 2M <constant name="struts.multipart.maxSize" value="20000000"></constant> --> <package name="manager" extends="struts-default"> <action name="upload" class="com.mrlv.action.FileUploadAction"> <result name="success">/success.jsp</result> <result name="input">/fileupload.jsp</result> <!-- 配置文件的大小及类型 --> <!-- 允许后缀名为png,bmp,jpg,doc,xls的文件上传 <interceptor-ref name="fileUpload"> <param name="allowedExtensions"> png,bmp,jpg,doc,xls </param> </interceptor-ref> --> <!-- 下面是限定文件类型以及文件大小 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg,image/pjpeg</param> <param name="maximumSize">81101</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
这里就是简单的文件上传了。如果是多文件上传的话,只需要在Action中接收file的时候,创建数组类型即可。
Struts2 文件下载
关于文件下载,返回的是文件流。
所以在创建Action的时,如下
package com.mrlv.action; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import com.opensymphony.xwork2.ActionSupport; public class FileDownloadAction extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; private String fileName; //返回的是一个文件流 public InputStream getInputStream() throws FileNotFoundException { //这里取得是下载文件的路径 File file = new File("C:/LX.txt"); //给文件命名,中文可能回有点问题 this.fileName = "LX.txt"; //返回一个文件流 return new FileInputStream(file); } public String getFileName() throws UnsupportedEncodingException { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
在struts.xml中的配置
<action name="download" class="com.mrlv.action.FileDownloadAction"> <result type="stream"> <!-- attachment这个参数,表示跟附件一样,filename这个参数是下载文件名${fileName}通过get方法获得 --> <param name="contentDisposition">attachment;filename=${fileName}</param> </result> </action>
接下来在jsp页面调用即可。
<a href="download">文件下载</a>