学习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中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
一.编译SRS https://github.com/winlinvip/simple-rtmp-server 目前有1.0-release.2.0.3.0等版本 2.0官方文档地址:https:// ...
- Linux发布WebApi
一:WebApi 使用Owin来做 http://www.cnblogs.com/xiaoyaodijun/category/666029.html 二:安装最新版的Jexus服务 https:// ...
- dubbo支持哪些通信协议和序列化协议
dubbo支持的通信协议 dubbo协议 dubbo://192.168.0.1:20188 默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议 适用的场景就是: ...
- Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法
Office 2010 word无法创建工作文件 请检查临时环境变量 的解决办法 http://hi.baidu.com/netshen/item/207fd935d452e0e9df2221c9 如 ...
- weblogic弱密码检测
http://www.secbox.cn/hacker/tools/6252.html http://60.12.168.73:8088/console/login/LoginForm.jsp htt ...
- Codeforces 609F Frogs and mosquitoes 线段树
Frogs and mosquitoes 用线段树维护每个点覆盖的最小id, 用multiset维护没有吃的蚊子. #include<bits/stdc++.h> #define LL l ...
- Java03动手动脑
1.当JAVA里定义的函数中去掉static后,怎么办? static代表静态,由于main函数是静态的,如果自己定义的函数方法加了static则在类加载时就一起加载了.但如果不写static,就必须 ...
- L1-006 连续因子 (20 分) 模拟
一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 3×5×6×7,其中 5.6.7 就是 3 个连续的数字.给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的 ...
- day46 html
老师的笔记: day46 课程安排 HTML CSS JS基础 DOM操作 jQuery Bootstrap pymysql Django基础 项目实战 Vue.js 今日概要: "PUT ...
- TF:利用TF的train.Saver将训练好的variables(W、b)保存到指定的index、meda文件—Jason niu
import tensorflow as tf import numpy as np W = tf.Variable([[2,1,8],[1,2,5]], dtype=tf.float32, name ...