Java轻量级MVC框架Struts2 2.5详解(6)struts2文件上传和下载

一、Struts2中简单的文件上传

     1):表单必须使用POST方式提交;

     2):使用二进制编码:enctype="multipart/form-data";

     3):<input type="file" name=""/>;

4):通过struts2标签生成表单

5):Action中通过Set()方法获得表单中的数据

 

6):将通过网络获得的文件复制到服务器目的 文件中

7):文件上传成功

8):代码示例

upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib uri="/struts-tags"  prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<br>
<s:property value="#message"/>
<s:form action="/uploadxxx" method="post" enctype="multipart/form-data">
	<s:textfield name="userName" label="操作人员"/><br>
	<s:file name="file" label="文件" /><br>
	<s:submit value="提交" /><br>
</s:form>
</body>
</html>

UploadAction.java

package org.openbox.upload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{

	private String userName;
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	//上传文件相关
	private File file;				//上传的文件
	private String fileFileName;    //文件原始名称
	private String fileContentType; //文件的MIME类型
	
	public void setFile(File file) {
		this.file = file;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
	
	public String fileUpload()throws Exception{
		//获得文件上传存放目录
		String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
		//创建一个目的文件
		File destFile=new File(realPath,fileFileName);
		//将当前获得的文件file,复制到目的文件中
		FileUtils.copyFile(file, destFile);
		
		//上传成功显示信息
		ActionContext.getContext().put("message", "文件 "+fileFileName+" 上传成功");		
		return Action.SUCCESS;
	}
}

配置文件struts-upload.xml 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="uploadPkg" namespace="/" extends="struts-default">
		<!-- 配置ACTION -->
		<action name="uploadxxx" class="org.openbox.upload.UploadAction" method="fileUpload">		
			<result name="success">/upload.jsp</result>
			<allowed-methods>fileUpload</allowed-methods>
		</action>
	</package>
</struts>

二、文件上传的细节控制 

1.文件的全局控制

  default.properties文件中有全局参数配置:

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
# struts.multipart.parser=jakarta-stream
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

  Struts2支持cos,pell,jakarta文件上传组件,默认使用的jakarta(Apache).

  struts.multipart.saveDir=                      //上传文件的临时目录,默认是在Tomcat下面.

  struts.multipart.maxSize=2097152      //一次请求允许上传文件的最大字节数,默认是2M.

2.单个文件上传控制

Struts2中的FileUploadInterceptor拦截器完成了文件上传的操作.

1):通过配置fileUpload拦截器参数,控制上传文件的大小和文件类型.

    1:控制单个文件的最大字节.

    2:控制上传文件的类型,比如png,jpg,jpeg,bmp.

 拦截失败,返回错误信息

3:完整控制代码

struts-upload.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="uploadPkg" namespace="/" extends="struts-default">
		<interceptors>
			<interceptor-stack name="mystack">
				<!-- 自定义文件上传拦截器参数 -->
				<interceptor-ref name="fileUpload">
					<!-- 参数来源FileUploadInterceptor文件属性字段 -->
					<param name="allowedExtensions">jpg,png</param>
					<param name="maximumSize">102400</param>
				</interceptor-ref>
				<!-- 重新引用默认拦截器 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>

		<!-- 全局引用自定义拦截器栈mystack -->
		<default-interceptor-ref name="mystack"></default-interceptor-ref>

		<!-- 配置ACTION -->
		<action name="upload" class="org.openbox.upload.UploadAction" method="fileUpload">
			<result name="input">/upload.jsp</result>
			<result name="success">/upload.jsp</result>
			<allowed-methods>fileUpload</allowed-methods>
		</action>
	</package>
</struts>

UploadAction.java代码

package org.openbox.upload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport{

	private String userName;
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	//上传文件相关
	private File file;				//上传的文件
	private String fileFileName;    //文件原始名称
	private String fileContentType; //文件的MIME类型
	
	public void setFile(File file) {
		this.file = file;
	}
	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}
	public void setFileContentType(String fileContentType) {
		this.fileContentType = fileContentType;
	}
	
	public String fileUpload()throws Exception{
		//获得文件上传存放目录
		String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
		//创建一个目的文件
		File destFile=new File(realPath,fileFileName);
		//将当前获得的文件file,复制到目的文件中
		FileUtils.copyFile(file, destFile);
		
		//上传成功显示信息
		ActionContext.getContext().put("message", "文件 "+fileFileName+" 上传成功");		
		return Action.SUCCESS;
	}
}

三、重新定义文件上传拦截失败出错提示

1:找到配置文件struts-messages.properties文件

2:在struts.xml配置国际化

 3:创建两种语言的国际化属性文件app_en_US.properties和app_zh_CN.properties

并在该文件中编辑属性

4:在jsp页面,使用国际化标签

四、文件下载

Struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。

1:配置struts-download.xml文件 

1):首先要为Action配置文件中,指定结果类型type="stream".

2):需要指定一个contentDispositiom响应头参数,使下载的文件名,就是页面显示的名称。

3):指定返回inputStream的方法名称。

2:DownloadAction.java文件

 

 1):通过set()和get()方法获取文件名

 2):创建一个getInputStream()方法,该方法名称需要一致,框架会自动调用该方法来获得下载数据流。

3):在getInputStream()方法中,创建下载文件,并将该文件以文件输入流的形式,返回给调用者。

3:download.jsp文件

4:下载结果 

5:代码示例 

1):download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h3>资源下载</h3><br>
<a href="/download?filename=qq20190227103302.png">qq20190227103302</a><br>
<a href="/download?filename=MYSQL中文帮助文档.chm">MYSQL中文帮助文档</a><br>
</body>
</html>

2):struts-download.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="downloadPkg" namespace="/" extends="struts-default">

		<!-- 配置ACTION -->
		<action name="download" class="org.openbox.download.DownloadAction" >	
		   <!-- 下载结果视图要使用stream结果类型 -->		
			<result type="stream" name="success">
				<!-- 设置文件下载参数:配置响应头,可以修改文件名 -->
				<param name="contentDisposition">attachment;filename=${filename}</param>
				<!-- 指定返回InputStream的方法名称,默认是:inputStream -->
				<param name="inputName">inputStream</param>
			</result>
			<allowed-methods>execute</allowed-methods>
		</action>
	</package>
</struts>

3):DownloadAction.java

package org.openbox.download;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{

	//获得文件名称filename
	private String filename;
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}

	//框架会调用该方法来获取下载的文件流数据,默认方法:getInputStream
	public InputStream getInputStream() throws FileNotFoundException, IOException {
		//获得文件下载目录
		String dir=ServletActionContext.getRequest().getServletContext().getRealPath("/WEB-INF/download");
		
		//创建一个文件
		File file=new File(dir,filename);
		
		//由文件创建一个流
		FileInputStream fileInputStream=new FileInputStream(file);
		
		//将该文件流返回给调用者
		return fileInputStream;
	}

	@Override
	public String execute() throws Exception {
		
		return Action.SUCCESS;
	}
}

猜你喜欢

转载自blog.csdn.net/openbox2008/article/details/87916030