您的位置:首页 > 编程语言 > Java开发

struts2文件上传和下载

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

一、struts2文件上传的demo

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

<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片"/>
<s:submit value="上传"/>

</s:form>


2、配置struts.xml为:

<action name="uploadOne" class="com.struts.user.action.UploadAction" method="uploadOne">
<result name="success">/welcome_user.jsp</result>
</action>


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文件:

<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片1"/>
<s:file name="photo" label="照片2"/>
<s:file name="photo" label="照片3"/>
<s:submit value="上传"/>
</s:form>

2、配置struts.xml为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="user" namespace="/" extends="struts-default">
<action name="uploadOne" class="com.struts.user.action.UploadAction" method="uploadOne"> <result name="success">/welcome_user.jsp</result> </action>
</package>
</struts>

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 + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
<s:a action="download?filename=1.jpg">1.jpg
</s:a>
<br>
<s:a action="download?filename=2.jpg">2.jpg</s:a>
<br>
<s:a action="download?filename=3.jpg">3.jpg</s:a>
<br>
</body>
</html>


2、配置struts.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="user" namespace="/" extends="struts-default">
<action name="download" class="com.struts.user.action.DownloadAction">
<result name="success" type="stream">
<!-- 设置文件名称的MIME类型,值不是固定的,值是动态的 -->
<param name="ContentType">${contentType}</param>
<!-- 设置弹出下载的窗口,文件名称是动态的值 , -->
<!-- 这里的${downloadFilename}是从DownloadAction类中的getDownloadFilename()方法中获得文件名,
浏览器中下载的弹出框中展示的就是这个名字 -->
<param name="ContentDisposition">attachment;filename=${downloadFilename}</param>
</result>
</action>
</package>
</struts>


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配置文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


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+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
<s:a action="download.action?fileName=1.jpg">download1</s:a>
</body>
</html>


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配置文件代码:

<?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>

<constant name="struts.devMode" value="true" />

<package name="default" namespace="/" extends="struts-default">

<action name="download" class="com.robert.action.DownloadAction">
<result type="stream">
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>

</package>

</struts>


点击下载页面的连接截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息