文件上传:
upload.jsp表单:
1):表单必须使用POST方式提交;
2):使用二进制编码:multipart/form-data
3):<input type="file"name=""/>;
<!-- 显示表单提交的错误信息 -->
<s:fielderror></s:fielderror>
<form action="up/upload" method="post" enctype="multipart/form-data">
用户名: <input type="text" name="username" /><br/>
文件:<input type="file" name="myUpload" id="file" /> <br/>
<input type="submit" value="上传"/>
<input type="reset" value="重置"/>
</form>
Struts2底层使用的是Apache的上传组件(commons-fileupload-1.3.1.jar)实现文件的上传
Struts2文件上传的细节:
Struts2中的FileUploadInterceptor拦截器完成了文件上传设置操作:
struts2.xml:
<package name="hell" extends="struts-default" namespace="/up">
<!-- 定义的拦截器 -->
<interceptors>
<interceptor-stack name="myStack">
<!-- 修改FileUploadIntercepto拦截器的默认值-->
<interceptor-ref name="fileUpload">
<!-- 设置上传的最大文件的大小1M 单位 1byte = 8bit -->
<param name="maximumSize">1048576</param>
<!-- 设置允许上传的文件扩展名类型(小心属性名坑, 查看源码setXxx)-->
<param name="allowedExtensions">jpg,gif</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="upload" class="cn.com.my.FileUpLoadAction" method="upload">
<result name="success" type="dispatcher">/success.jsp</result>
<result name="input" type="dispatcher">/upload.jsp</result>
</action>
</package>
action:
public class FileUpLoadAction extends ActionSupport{
private String username;
//命名框架固定格式 对应file表单的name值
private File myUpload; //上传的文件
private String myUploadFileName; //上传的文件名
private String myUploadContentType; //上传的文件类型 -- image/jpeg
public String upload() throws IOException {
//直接保存到磁盘中
//将文件保存到当前/upload文件夹中
//获取到指定相对路径对应的绝对路径。
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
System.out.println(realPath);
//构建一个目标文件,将数据拷贝到目标文件中
File destFile = new File(realPath,myUploadFileName);
FileUtils.copyFile(myUpload, destFile);
return SUCCESS;
}
//getter/setter
}
文件下载:
Struts2提供 stream 结果类型,专门用于支持文件下载功能的。
属性修参考 struts-default.xml中 stream 拦截器
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
![](https://i-blog.csdnimg.cn/blog_migrate/d10cdd158bbc801dd7e73fb87318c234.png)
contentType: 指定被下载文件的文件类型;
inputName: 指定被下载文件的入口输入流;
contentDisposition: 指定下载的文件名;
bufferSize: 指定下载文件时的缓冲大小。
表单:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!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>
<h3>资源下载</h3>
<a href="down/download.action?filename=file1.zip">资源1</a><br/>
<a href="down/download.action?filename=file2.zip">资源2</a><br/>
</body>
</html>
struts2.xml:
<package name="downPkg" extends="struts-default" namespace="/down">
<action name="download" class="cn.com.my.DownloadAction" method="download">
<!-- type="stream" 指定当前请求以下载的方法响应到浏览器中 -->
<result name="success" type="stream">
<!-- 可以通过修改inputName属性的值 修改处理下载请求的方法名称 -->
<param name="inputName">inputStream</param>
<!-- 指定下载的文件名
attatchment: 浏览器以下载的方式处理当前数据,不打开文件
filename: 指定下载的文件名为当前文件的文件名
-->
<param name="contentDisposition">attatchment;filename=${filename}</param>
</result>
</action>
</package>
action:
package cn.com.my;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport{
private String filename;
private File file;
public String download() {
//根据传递来的文件名找到对应的文件。
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/download");
System.out.println(filename);
System.out.println(realPath);
file = new File(realPath,filename);
//将找到的文件响应到浏览器弹出下载页面 下载
//返回值不应该对应一个物理地址(不是简单页面跳转)
return SUCCESS;
}
//给struts2框架调用, 将获取到要下载的文件数据响应给浏览器
public InputStream getInputStream() throws Exception {
return new FileInputStream(file);
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
}