关于struts2的上传和下载
1. 1文件上传技术:
JSPSmartUpload:应用在Model1年代.(嵌入到JSP)
FileUpload:应用在Model2年代.
Servlet3.o:完成文件上传.
Struts2框架:完成文件上传.
1.2 文件上传要素:
* 1.表单的提交方式:POST.(POST 没有大小限制)
* 2.表单元素中需要有<input type=”file”>这个元素必须有一个name属性.
* 3.表单的enctype属性是multipart/form-data(MIME协议中的分部分.)
1.3 Struts2完成文件上传:
页面:
文件上传:<input type="file" name="upload"><br/>
<s:form theme="simple" action="templateAction_%{ id == null? 'add' : 'edit' }" namespace="/" method="post" enctype="multipart/form-data">
Action:
提供三个属性:
private File upload; // 获得文件
private String uploadContentType; // 获得文件类型
private String uploadFileName; // 获得文件名
对三个属性提供set方法:
2.1 文件下载原理:
将服务器上一个文件输出到浏览器:
* 设置两个头和一个流.
* ContentType:文件的MIME类型.
* Content-Dispostion:提示下载.
* 代表文件的输入流:---(输出流是固定的response.getOutputStream();)
2.2 Struts2中的文件下载:
依赖一个stream的结果类型:
在Action中提供:
// 获得文件的MIME类型的方法:
// 相当于Action类中有contentType属性.
public String getContentType() {
// 如何获得文件的MIME类型?
String type = ServletActionContext.getServletContext().getMimeType(
filename);
return type;
}
// 提供一个流
public InputStream getInputStream() throws FileNotFoundException {
// web 项目:
// 获得download的磁盘绝对路径
String realpath = ServletActionContext.getServletContext().getRealPath(
"/download");
InputStream is = new FileInputStream(realpath + "/" + filename);
return is;
}
// 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
// 中文:IE浏览器用URLEncoder Firefox:Base64编码.
public String getFileName() throws IOException {
// 获得浏览器类型:
String agent = ServletActionContext.getRequest()
.getHeader("User-Agent");
// 调用该方法进行编码
String name = encodeDownloadFilename(filename, agent);
return name;
}
/**
* 下载文件时,针对不同浏览器,进行附件名的编码
*
* @param filename
* 下载文件名
* @param agent
* 客户端浏览器
* @return 编码后的下载附件名
* @throws IOException
*/
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;
}
在配置文件中:
<!-- 配置文件下载的Action -->
<package name="download" extends="struts-default">
<action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
<!-- 完成下载 需要在result的type属性上使用stream -->
<result name="success" type="stream">
<!-- 参数的name是stream结果类型中的参数的名称 -->
<!-- OGNL表达式:获得到Action中contentType的属性! -->
<param name="contentType">${contentType}</param>
<!-- 设置ContentDispostion -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!-- <param name="inputName">${stream}</param> -->
</result>
</action>
</package>
依赖一个stream的结果类型:
在Action中提供:
// 获得文件的MIME类型的方法:
// 相当于Action类中有contentType属性.
public String getContentType() {
// 如何获得文件的MIME类型?
String type = ServletActionContext.getServletContext().getMimeType(
filename);
return type;
}
// 提供一个流
public InputStream getInputStream() throws FileNotFoundException {
// web 项目:
// 获得download的磁盘绝对路径
String realpath = ServletActionContext.getServletContext().getRealPath(
"/download");
InputStream is = new FileInputStream(realpath + "/" + filename);
return is;
}
// 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
// 中文:IE浏览器用URLEncoder Firefox:Base64编码.
public String getFileName() throws IOException {
// 获得浏览器类型:
String agent = ServletActionContext.getRequest()
.getHeader("User-Agent");
// 调用该方法进行编码
String name = encodeDownloadFilename(filename, agent);
return name;
}
/**
* 下载文件时,针对不同浏览器,进行附件名的编码
*
* @param filename
* 下载文件名
* @param agent
* 客户端浏览器
* @return 编码后的下载附件名
* @throws IOException
*/
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;
}
在配置文件中:
<!-- 配置文件下载的Action -->
<package name="download" extends="struts-default">
<action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
<!-- 完成下载 需要在result的type属性上使用stream -->
<result name="success" type="stream">
<!-- 参数的name是stream结果类型中的参数的名称 -->
<!-- OGNL表达式:获得到Action中contentType的属性! -->
<param name="contentType">${contentType}</param>
<!-- 设置ContentDispostion -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!-- <param name="inputName">${stream}</param> -->
</result>
</action>
</package>
关于struts2的上传和下载的更多相关文章
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- 十六、Struts2文件上传与下载
文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...
- 【SSH2(实用文章)】--Struts2文件上传和下载的例子
回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...
- 学习Struts--Chap07:Struts2文件上传和下载
1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- struts2学习(13)struts2文件上传和下载(1)
一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现 ...
- Struts2文件上传与下载
一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...
- struts2文件上传和下载
1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截 ...
随机推荐
- App是什么,可以分为几类?及其相关解释。
App,是应用程序,Application的缩写,事实上,严格说来,目前市面上的APP大致可分为以下十类,即移动UGC,移动搜索,移动浏览,移动支付,移动广告,移动即时信息,SNS,LBS,AR以及 ...
- suds 在python3.x上的安装并访问webservice
类库安装 直接使用命令行:pip install suds 报错:Traceback (most recent call last): File "setup.py", li ...
- tar常用解包
(1)常见解压缩包 .tar解包 tar -xvf xxxx.tar 打包 tar -cvf xxxx .tar.bz2解包 bzip2 -d xxxx.tar.bz2 #会解压成. ...
- bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...
- HLA中常用的基本术语
(1)联邦(Federation):用于实现某一特定仿真目的的分布仿真系统. (2)联邦成员(Federate):参与联邦的所有应用都称为联邦成员,简称成员. (3)对象(Object):构成成员的基 ...
- Petshop学习第三天
ASP.NET缓存 ASP.NET充分利用缓存机制,通过某种方法,将系统需要的数据对象.Web页面存储在内存中,使得Web站点需要这些数据时,不经过繁琐的数据库连接.查询和复杂的逻辑运算,就可以触手可 ...
- 初页CTO丁乐:分布式以后还能敏捷吗? - 极客头条 - CSDN.NET
初页CTO丁乐:分布式以后还能敏捷吗? - 极客头条 - CSDN.NET
- A Tour of Go Maps
A map maps keys to values. Maps must be created with make (not new) before use; the nil map is empty ...
- ilitek的电容屏驱动程序ilitek_aimvx.c的分析
本文记录了ili驱动程序. 参考 http://linhui.568.blog.163.com/blog/static/962652682011786352856/ 后记:现在的情况是,在win上是 ...
- Info.plist和pch文件的作用