学习Struts--Chap07:Struts2文件上传和下载
1、struts2文件上传
1.1、struts2文件上传的基本概述
在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为multipart/form-data。只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理multipart/form-data的请求,它需要调用其它上传框架来解析二进制请求数据,但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
1.2、struts2文件上传的一些规范说明
- Struts2 文件上传基于 Struts2 拦截器实现;
- Struts2 文件上传使用的是 fileupload 组件;
- Form表单中需要配置 enctype="multipart/form-data";以便于让文件以二进制的形式传送给服务器。
- Struts2 获取上传文件:name (name 是文件表单的 name);
- Struts2 获取上传文件名:name+FileName;
- Struts2 获取上传文件的类型:name+ContentType;
1.3、struts2文件上传的代码实例
上传文件的首页:
<%@ 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>上传文件的首页</title>
</head>
<body>
<!-- 因为我们对文件的类型和文件的大小进行了限制,所以当出现不符合要求的文件上传的情况发生的时候,系统会报错用以提示用户 -->
<s:fielderror></s:fielderror>
<form action="upload" method="post" enctype="multipart/form-data">
文件:<input type="file" name="java1234"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
用于处理上传文件的Action:
package com.java1234.action;
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; // �ļ�应以一个文件,一定要和form表单中的文件名称一致
private String java1234FileName; //定义一个变量表示文件名称(这个名称是有规范说明的)
private String java1234ContentType; //定义一个变量表示文件类型(这个名称是有规范说明的)
public File getJava1234() {
return java1234;
}
public void setJava1234(File java1234) {
this.java1234 = java1234;
}
public String getJava1234FileName() {
return java1234FileName;
}
public void setJava1234FileName(String java1234FileName) {
this.java1234FileName = java1234FileName;
}
public String getJava1234ContentType() {
return java1234ContentType;
}
public void setJava1234ContentType(String java1234ContentType) {
this.java1234ContentType = java1234ContentType;
}
@Override
public String execute() throws Exception {
System.out.println("文件名称"+java1234FileName);
System.out.println("文件类型"+java1234ContentType);
String filePath="C:/"+java1234FileName;
File saveFile=new File(filePath);
FileUtils.copyFile(java1234, saveFile);
return SUCCESS;
}
}
Struts2.xml文件的配置:
<?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>
<!-- 允许上传大文件 -->
<constant name="struts.multipart.maxSize" value="20000000"></constant> <package name="manager" extends="struts-default"> <action name="upload" class="com.java1234.action.FileUploadAction">
<result name="success">/success.jsp</result>
<result name="input">/fileupload.jsp</result> <!-- 配置文件的大小及类型 -->
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg</param>
<param name="maximumSize">81101</param>
</interceptor-ref> <!-- 特别注意:当我们重写一个拦截器的时候,根据规范要求就不会再使用默认的拦截器,
所以我们要想继续使用默认的拦截器,就需要在这个重新引用一下 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action> </package> </struts>
文件上传成功之后的返回页:
<%@ 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>上传成功之后的返回页</title>
</head>
<body>
文件上传成功!
</body>
</html>
2、配置上传文件的类型和大小
<param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg</param>
<param name="maximumSize">81101</param>
我们需要在struts.xml文件中对应的<action>标签中配置上传文件的类型和大小,因为我们知道struts2的文件上传功能是基于拦截器实现的,为了实现这个限制上传文件大小和类型的功能,我们需要在一个
名为:fileUpload的拦截器中添加参数,参数的类型以及写法如上代码所展示的。当我们重写一个拦截器的时候,根据规范要求就不会再使用默认的拦截器,所以我们要想继续使用默认的拦截器,就需要在这里
重新引用一下defaultStack。
3、如何实现大文件的上传
<constant name="struts.multipart.maxSize" value="20000000"></constant>
要想实现文件上传只需要在配置文件的的<package>标签的外边添加上如上的代码,意思就是重新定义一下允许上传的最大文件为多少。
4、如何实现多文件上传
其实,实现多文件的上传和单个文件上传的基本思路是一样的,不同的地方就是如果我们要想一次性上传多个文件,首先就是上传的界面端要允许一次性选择多个文件,然后就是对应处理请求的Action要使用数组的形式循环处理每一个上传的文件,但话又说回来了,单独看每一次循环的时候,就和单独上传一个文件时的处理是没有区别的。
我接下来会用代码简单演示如何实现多文件上传:
上传文件的首页:
<%@ 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>
<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:
package com.java1234.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import com.opensymphony.xwork2.ActionSupport;
public class FilesUploadAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private File[] java1234; // 文件,使用数组进行接收
private String[] java1234FileName; // 文件名,使用数组进行接收
private String[] java1234ContentType; // 文件类型,使用数组进行接收
public File[] getJava1234() {
return java1234;
}
public void setJava1234(File[] java1234) {
this.java1234 = java1234;
}
public String[] getJava1234FileName() {
return java1234FileName;
}
public void setJava1234FileName(String[] java1234FileName) {
this.java1234FileName = java1234FileName;
}
public String[] getJava1234ContentType() {
return java1234ContentType;
}
public void setJava1234ContentType(String[] java1234ContentType) {
this.java1234ContentType = java1234ContentType;
}
@Override
public String execute() throws Exception {
//循环处理每一个接收到的文件,其实每一次遍历循环就相当于是处理一个单个上传的文件
for(int i=0;i<java1234.length;i++){
System.out.println("文件名:"+java1234FileName[i]);
System.out.println("文件类型:"+java1234ContentType[i]);
String filePath="C:/"+java1234FileName[i];
File saveFile=new File(filePath);
FileUtils.copyFile(java1234[i], saveFile);
}
return SUCCESS;
}
}
Struts2.xml文件的配置:
<?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> <constant name="struts.multipart.maxSize" value="20000000"></constant> <package name="manager" extends="struts-default"> <action name="uploads" class="com.java1234.action.FilesUploadAction">
<result name="success">/success.jsp</result>
<result name="input">/filesupload.jsp</result>
</action> </package> </struts>
文件上传成功之后的返回页:
<%@ 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>
全部文件上传成功!
</body>
</html>
5、struts2文件下载
文件下载就是在指定的地地方把指定的文件下载到指定的地方的一个过程,这里边最需要注意的是文件下载是以二进制流(InputStream)的形式进行传输的,所以我们要注意在获取文件名称的时候使用格式的转化,防止出现乱码的现象;还有一个就是文件地址的设置问题,这些细节地方不注意的话都会引起代码的运行错误。为了简单起见,我们可以指定下载的链接地址,然后通过代码处理来设定下载后的文件名称是什么。
Action.java文件:
package com.java1234.action;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownLoadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String downloadPath;// 文件下载的路径
private String contentType;// 下载的文件类型
private String fileName;// 下载的文件名称
public String getDownloadPath() {
return downloadPath;
}
public void setDownloadPath(String downloadPath) {
this.downloadPath = downloadPath;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String execute() throws Exception {
// 获取想要下载的文件的相对路径
downloadPath = ServletActionContext.getRequest().getParameter("download");
// 借助lastIndexOf函数找到最后一个‘/’后边的字符串就是文件的名称
int position = downloadPath.lastIndexOf("/");
// 为了安全起见。需要先进行一个判断
// 如果pasition的数值大于0.那么就说明这个文件名称前面还有一个相对路径
if (position > 0) {
// 获取文件名称
fileName = downloadPath.substring(position + 1);
} else {
fileName = downloadPath;
}
// 指定下载的文件的类型
contentType = "application/msword";
return SUCCESS;
}
public InputStream getInputStream() throws Exception {
InputStream inputStream1 = ServletActionContext.getServletContext()
.getResourceAsStream(downloadPath);
return inputStream1;
}
}
struts2.xml文件:
<?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>
<package name="default" namespace="/" extends="struts-default">
<action name="downloadFile" class="com.java1234.action.FileDownLoadAction">
<!-- result类型是流(stream)类型 -->
<result name="success" type="stream">
<!-- inputName指向被下载文件的来源,对应Action中返回的InputStream -->
<param name="inputName">inputStream1</param>
<!-- 下载的内容类型,如图片类型、文档类型等…… -->
<param name="contentType">${contentType}</param>
<param name="contentDisposition">
<!-- 指定文件下载的处理方式,内联(inline)和附件(attachment)两种方式,attachment会弹出文件保存对话框 -->
attachment;filename=${filename}
</param>
</result>
</action>
</package>
</struts>
filedownload.jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>FileDownLoad</title>
</head>
<body>
<a href="<%=Path%>/downloadFile?download=UploadFile/readme.doc">点击链接下载文件</a>
</body>
</html>
学习Struts--Chap07:Struts2文件上传和下载的更多相关文章
- struts2学习(14)struts2文件上传和下载(4)多个文件上传和下载
四.多个文件上传: 五.struts2文件下载: 多个文件上传action com.cy.action.FilesUploadAction.java: package com.cy.action; i ...
- struts2学习(13)struts2文件上传和下载(1)
一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现 ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- 【SSH2(实用文章)】--Struts2文件上传和下载的例子
回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- Centos+Redis 集群
Redis 3.2.6集群搭建 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave- ...
- INFO JobScheduler: Added jobs for time 1524468752000 ms/INFO MemoryStore: Block input-0-1524469143000 stored as bytes in memory/完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行
1.完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行: 1 [hadoop@slaver1 spark- ...
- C#学习-方法
方法是由方法签名和一系列语句的代码块组成. 其中方法签名包括方法的访问级别(比如public或private).可修饰符(例如abstract关键字).方法名称和参数. C#也支持方法重载.方法重载指 ...
- 【Android】jar包Proguard混淆方法
本文章的前提条件是,读者已经掌握了正确导出jar包的技能. 1.拷贝Android项目中“proguard.cfg”文件到你指定的位置,并改名为“proguard.pro”,此步是为proguardg ...
- Python_列表常用操作
%d 数字 %f 浮点 %s 字符串 字符串常用功能: .strip() 默认去掉字符串两边空格#或者在括号里注明去除什么 查看列表方法:dir(列表名) .append(元素): ...
- JVM性能参数优化
以上是jdk1.7的默认GC回收器 Java的gc回收的类型主要有几种 UseSerialGC, UseConcMarkSweepGC, UseParNewGC, UseParallelGC, Use ...
- oracle中查找某用户执行某张表的操作操作记录
转载:http://www.cnblogs.com/nizuimeiabc1/p/9441937.html 1,首先查找表的操作记录 select * from v$sqlarea a where a ...
- P1087 FBI树 二叉树
题目描述 我们可以把由“00”和“11”组成的字符串分为三类:全“00”串称为BB串,全“11”串称为I串,既含“00”又含“11”的串则称为F串. FBIFBI树是一种二叉树,它的结点类型也包括FF ...
- Spring Security(15)——权限鉴定结构 RoleVoter
http://www.cnblogs.com/fenglan/p/5913432.html
- 整合django和bootstrap框架
环境: python版本:2.7.8 django版本:1.7.1 bootstrap版本:3.3.0 首先github上面有两个开源的项目用来整合django和bootstrap. https:// ...