学习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中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- Ubuntu下VS Code 字体设置 + 标签匹配、括号匹配插件
Ubuntu下比较好看的字体有: Courier NewSource Code ProWenQuanYi Micro HeiWenQuanYi Micro Hei MonoUbuntuDroid Sa ...
- eclipse工具下hadoop环境搭建
eclipse工具下hadoop环境搭建: window10操作系统中搭建eclipse64开发系统,配置hadoop的eclipse插件,让eclipse可以查看Hdfs中的文件内容. ...
- [转] css3变形属性transform
w3c上的例子是这样子写的:· div { transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform: ...
- Java面向对象三大特性
封装.继承.多态. 1.封装 封装就是将对象的属性和行为特征包装到一个程序单元(即类)中,把实现细节隐藏起来,通过公用的方法来展现类对外提供的功能,提高了类的内聚性,降低了对象之间的耦合性. 2.继承 ...
- php处理IOS图片旋转
$picAddr = $url; $exif = exif_read_data($picAddr); $image = imagecreatefromjpeg($picAddr); if($exif[ ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-1目录
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- SPOJ LCS - Longest Common Substring 字符串 SAM
原文链接http://www.cnblogs.com/zhouzhendong/p/8982392.html 题目传送门 - SPOJ LCS 题意 求两个字符串的最长公共连续子串长度. 字符串长$\ ...
- Python scrapy爬虫学习笔记01
1.scrapy 新建项目 scrapy startproject 项目名称 2.spiders编写(以爬取163北京新闻为例) 此例中用到了scrapy的Itemloader机制,itemloade ...
- hive中的分桶表
桶表也是一种用于优化查询而设计的表类型.创建通表时,指定桶的个数.分桶的依据字段,hive就可以自动将数据分桶存储.查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率 ------创 ...
- 多媒体开发(8):调试FFmpeg
编译FFmpeg得到二进制文件,之后就是对二进制库的调用,这时FFmpeg就像一个黑盒子.作为程序员,难道不想研究一下FFmpeg的具体实现?比如是怎么拿到歌曲信息的.怎么解码的.怎么推流的,等等. ...