博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2文件上传和下载
阅读量:4290 次
发布时间:2019-05-27

本文共 7853 字,大约阅读时间需要 26 分钟。

struts2中把文件上传和下载功能都做了封装,使得我们使用起来很简单,今天这篇博客就介绍struts2框架中文件的上传和下载功能,分别是单个文件上传,多文件上传,文件下载,文件下载写了两种方式,读者朋友们可以选择适合自己的使用,在写的过程中,如果有写 的不对的地方,或者是解释的不清楚的地方,欢迎朋友们留言批评指正!!

一、struts2文件上传的demo

1、新建一个upload.jsp文件:

2、配置struts.xml为:

/welcome_user.jsp
3、uploadAction代码是:

package com.struts.user.action;import java.io.File;import java.io.IOException;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport {	private String username;	private File photo;//表单中的文件名称,这里暂时称为inputName	private String photoFileName;// 上传的文件名:上面的inputName+"FileName",必须这么写	private String photoContentType;// 上传的文件的MIME类型:上面的inputName+“ContentType”,必须这么写	public String uploadOne() throws IOException {		System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "				+ photoContentType);		// 上传		String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");		FileUtils.copyFile(photo, new File(storeDir, photoFileName));		return SUCCESS;	}	public String getPhotoFileName() {		return photoFileName;	}	public void setPhotoFileName(String photoFileName) {		this.photoFileName = photoFileName;	}	public String getPhotoContentType() {		return photoContentType;	}	public void setPhotoContentType(String photoContentType) {		this.photoContentType = photoContentType;	}	public String getUsername() {		return username;	}	public void setUsername(String username) {		this.username = username;	}	public File getPhoto() {		return photo;	}	public void setPhoto(File photo) {		this.photo = photo;	}}

其中关于下图中的UploadAction类中属性,上传的文件名和上传的MIME类型为什么必须那么些,是因为在struts2的源码中规定只能那么写,

下面截取struts2中的文件上传的拦截器FileUploadInteceptor,来说明UploadAction中文件名和MIME类型那么写的原因:

如图所示,上传文件需要的文件名称和MIME类型,规定为表单中inputName字符串+“ContentType”和“FileName”,所以我们在UploadAction中只能那么写。

上传成功结果:

二、多文件上传demo

1、新建一个upload.jsp文件:

2、配置struts.xml为:

/welcome_user.jsp
3、uploadAction代码是:

package com.struts.user.action;import java.io.File;import java.io.IOException;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport {	private String username;	private File[] photo;	private String[] photoFileName;// 上传的文件名	private String[] photoContentType;// 上传的文件的MIME类型	public String uploadOne() throws IOException {		System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "				+ photoContentType);		// 上传		String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");		if (photo != null && photo.length > 0) {			for (int i = 0; i < photo.length; i++) {				FileUtils.copyFile(photo[i], new File(storeDir, photoFileName[i]));			}		}		return SUCCESS;	}	public String getUsername() {		return username;	}	public void setUsername(String username) {		this.username = username;	}	public File[] getPhoto() {		return photo;	}	public void setPhoto(File[] photo) {		this.photo = photo;	}	public String[] getPhotoFileName() {		return photoFileName;	}	public void setPhotoFileName(String[] photoFileName) {		this.photoFileName = photoFileName;	}	public String[] getPhotoContentType() {		return photoContentType;	}	public void setPhotoContentType(String[] photoContentType) {		this.photoContentType = photoContentType;	}}
4、成功结果打印

三、文件下载

这篇博客中写两个下载的项目,都可以,下面先写第一个:

项目一:

项目展示 :

1、新建download.jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib prefix="s" uri="/struts-tags"%><%	String path = request.getContextPath();	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()			+ path + "/";%>My JSP 'index.jsp' starting page
1.jpg
2.jpg
3.jpg
2、配置struts.xml文件:

${contentType}
attachment;filename=${downloadFilename}

3、新建下载action类:

package com.struts.user.action;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import sun.misc.BASE64Encoder;public class DownloadAction extends ActionSupport{	//接受文件的名称    private String filename;     /*     *  get请求的中文乱码问题需要自己解决     */    public void setFilename(String filename) throws UnsupportedEncodingException{        this.filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");    }         /*     *  提供一个方法,能获取的文件的MIME类型     */    public String getContentType(){        return ServletActionContext.getServletContext().getMimeType(filename);    }         /*     * 返回的是文件的名称     * 在弹出的下载窗口中,显示中文会有乱码的问题     * 判断浏览器,根据不同的编码解决乱码的问题     */    public String getDownloadFilename() throws IOException{        // 先获取user-agent头信息        String agent = ServletActionContext.getRequest().getHeader("user-agent");        // 调用该方法,编码        String name = this.encodeDownloadFilename(filename, agent);        return name;    }         /*     * 根据user-agent的头,和文件的名称,解决中文文件名编码的问题     */    public String encodeDownloadFilename(String filename, String agent) throws IOException{        if(agent.contains("Firefox")){ // 火狐浏览器            filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";        }else{ // IE及其他浏览器            filename = URLEncoder.encode(filename,"utf-8");        }        return filename;    }              /*     * 提供一个方法名称必须是getInputStream()方法     */    public InputStream getInputStream(){        // 获取要下载的文件的输入流,返回        return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename);    }         @Override    public String execute() throws Exception{        return SUCCESS;    }}

注意:上面的

public InputStream getInputStream(){        // 获取要下载的文件的输入流,返回        return ServletActionContext.getServletContext().getResourceAsStream("/upload/"+filename);    }
这个方法中的upload下面一定要有您下载的文件的,且名字相同,负责会报错

4、下载弹出框:

项目二:

项目展示:

web.xml配置文件代码:

index.jsp
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*

index.jsp文件代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'index.jsp' starting page	
download1
DownloadAction.java代码:

package com.robert.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.Action;public class DownloadAction {	private String fileName;	public String execute() {		return Action.SUCCESS;	}	public InputStream getInputStream() throws FileNotFoundException {		HttpServletRequest req = ServletActionContext.getRequest();		String path = req.getRealPath("/download");		return new FileInputStream(new File(path, fileName));	}	public String getFileName() {		return fileName;	}	public void setFileName(String fileName) {		this.fileName = fileName;	}}
struts.xml配置文件代码:

attachment;filename=${fileName}
点击下载页面的连接截图:

你可能感兴趣的文章
不知道分布式事务,还想进互联网大厂
查看>>
mysql为什么使用B+树作为索引的结构
查看>>
mysql索引总结(1)-mysql 索引类型以及创建(文章写的不错!!!)
查看>>
聊聊CAS - 面试官最喜欢问的并发编程专题
查看>>
Spring Boot 中使用一个注解轻松将 List 转换为 Excel 下载
查看>>
高并发环境下,先操作数据库还是先操作缓存?
查看>>
MySQL Explain详解
查看>>
一直搞不清楚什么是读写分离,主从复制的原理,今天总算搞懂了
查看>>
消息队列 mq 必会面试题
查看>>
线程池的工作原理是啥?能手写一个线程池吗?
查看>>
一口气说出 6种 延时队列的实现方案,大厂offer稳稳的
查看>>
原来redis这么简单,跟着文章操作一遍你就会了
查看>>
Redis两种持久化机制RDB和AOF详解(面试常问,工作常用)
查看>>
事务隔离级别中的可重复读能防幻读吗?
查看>>
老伙计,关于JDK并发包,这些不为人知的秘密你知道多少?
查看>>
图片的左右切换
查看>>
进级的RecyclerView——LRecyclerView
查看>>
Android 利用Gradle实现app的环境分离
查看>>
Android系统篇之----Binder机制和远程服务调用
查看>>
JavaScript DOM 属性
查看>>