十六、Struts2文件上传与下载
文件上传与下载
1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">
2.动作类中字段需要符合命名规范
表单字段名:image
动作类:File image;
String imageFileName; 文件名
String imageContentType;文件的MIME类型
3.上传拦截器参数的配置
文件大小、文件类型限制等
错误消息提示:中文
4.多文件上传:File或者List数组
单文件上传
开发步骤:
Jsp代码:
<br/> ----单文件上传----<br/>
<s:form
action="uploadOneAction"
enctype="multipart/form-data"><s:textfield
name="username"
label="姓名"></s:textfield><s:file
name="photo"
label="相片"></s:file><s:submit
value="上传"></s:submit></s:form>
Struts.xml文件配置代码:
<package
name="p1"
extends="struts-default"><action
name="uploadOneAction"
class="com.itheima.action.UploadAction1"><result>/success.jsp</result>
</action>
</package>
动作类代码:
public
class
UploadAction1
extends ActionSupport {// 变量命名需与表单名称保持一致
private String username;
// 与表单字段对应,必须是java.io.File类型的
private File photo;
// 上传的文件名,格式:上传字段名+FileName
private String photoFileName;
// 上传文件MIME类型,格式:上传字段名+ContentType
private String photoContentType;
public String execute() throws Exception {
// 打印相关字段属性
System.out.println(username);
System.out.println(photo);
System.out.println(photoFileName);
System.out.println(photoContentType);
/*
* 上传文件步骤:
* 1.得到上传文件的真实路径
* 2.构建输入流
* 3.构建输出流
*/
// 1.得到上传文件的真实路径
//上传字段:上传到某个文件夹。存到应用的files目录下
String storeDir = ServletActionContext.getServletContext().getRealPath(
"files");
// 把上传过来的文件,重写创建一个文件
File file = new File(storeDir, photoFileName);
/*
// 以前复制文件的方式
* 但是现在呢?我们不需要这么做啦,Struts2都帮我们封装了
InputStream in = new FileInputStream(photo);
OutputStream out = new FileOutputStream(file);
int
len = 0;byte[] bys = new byte[1024];
while ((len = in.read(bys)) != -1) {
out.write(bys, 0, len);
}
in.close();
out.close();
*/
FileUtils.copyFile(photo, file);
return
SUCCESS;}
}
2、多文件上传
将文件类型定义为:List 或者File数组
Jsp代码:
<br>-----多文件上传-----<br>
<form
action="${pageContext.request.contextPath}/upload2.action"
method="post"
enctype="multipart/form-data">用户名:<input
type="text"
name="username"/><br/>靓照:<input
type="file"
name="photo"/><br/>靓照:<input
type="file"
name="photo"/><br/><input
type="submit"
value="上传"/></form>
Struts.xml文件配置代码:
<action
name="upload2"
class="com.itheima.actions.UploadAction2"
method="upload"><!-- <interceptor-ref name="defaultStack"> -->
<!-- <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> -->
<!-- <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> -->
<!-- </interceptor-ref> -->
<result>/success.jsp</result>
<result
name="error">/error.jsp</result><result
name="input">/indexMulti.jsp</result></action>
动作类代码:
//文件上传:fileUpload拦截器完成的
public
class
UploadAction2
extends ActionSupport {private String username;
private File[] photo;//和表单的上传字段名保持一致。类型是File类型的 .数组或List
private String[] photoFileName;//上传的文件名
private String[] photoContentType;//上传文件的MIME类型
public String upload(){
//上传字段:上传到某个文件夹。存到应用的images目录下
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
File directory = new File(realPath);
if(!directory.exists()){
directory.mkdirs();
}
try {
for(int
i=0;i<photo.length;i++){FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));
}
return
SUCCESS;} catch (IOException e) {
e.printStackTrace();
return
ERROR;}
}
}
3、原理分析:
a、是由一个拦截器来完成的。fileUpload
可以通过配置拦截器的参数,指定拦截的扩展名或文件的MIME类型
<action
name="uploadOneAction"
class="com.itheima.action.UploadAction1"><interceptor-ref
name="defaultStack"><!--对已有的拦截器注入参数 -->
<param
name="fileUpload.allowedExtensions">txt</param></interceptor-ref>
<result>/success.jsp</result>
</action>
b、超出大小或非法文件的上传,会报错(转向一个input的视图)
通过:
<s:actionError/> <s:feildError/>显示错误消息的提示
c、错误消息提示改为中文版:借助国际化的消息资源文件
如果是通过配置全局默认参数引起的错误,最好用全局的消息资源文件。
struts2默认的提示资源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比着key值覆盖对应的value即可。
4、文件下载
原理:是一个结果类型来处理的。stream
编码步骤:
动作类:
public
class
DownloadAction
extends ActionSupport {// 文件下载用到的输入流
private InputStream imageFileIn;
// 记住下载文件的文件名
private String fileName;
public String download1() throws Exception {
// 给输入流赋值即可
String realPath = ServletActionContext.getServletContext().getRealPath(
"/file/mm.jpg");
// c:\apacher\file\4.jpg
fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 解决中文名称乱码文件
fileName = URLEncoder.encode(fileName, "UTF-8");
imageFileIn = new FileInputStream(realPath);
return
SUCCESS;}
}
struts.xml配置文件:主要是对stream类型的结果进行配置
<action
name="download1"
class="com.itheima.action.DownloadAction"
method="download1"><result
type="stream"><!--动作类中InputStream的字段名 -->
<param
name="inputName">imageFileIn</param><!-- 告知浏览器响应头:文件的MIME类型 -->
<param
name="contentType">application/octet-stream</param><!--告诉浏览器下载的方式 -->
<!-- 使用OGNL表达式获取动作类中的属性 -->
<param
name="contentDisposition">attachment;filename=${fileName}</param></result>
</action>
十六、Struts2文件上传与下载的更多相关文章
- Struts2文件上传和下载(原理)
转自:http://zhou568xiao.iteye.com/blog/220732 1. 文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1) ...
- 【SSH2(实用文章)】--Struts2文件上传和下载的例子
回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...
- 学习Struts--Chap07:Struts2文件上传和下载
1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...
- struts2 文件上传和下载,以及部分源代码解析
struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- struts2学习(13)struts2文件上传和下载(1)
一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现 ...
- Struts2学习(六)———— 文件上传和下载
一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮 ...
- Struts2文件上传与下载
一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...
随机推荐
- Nginx 配置指令location 匹配符优先级和安全问题【转】
Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...
- [Flex] IFrame系列 —— 在flex的web应用中嵌入html的方法
在flex的web应用中,我们往往必须有嵌入html的需求,这时候你会发现IFrame很有用! flex而且可以和html中的JavaScript进行交互,flex可以通过iframe调用到html中 ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- [SQL]SQL语言入门级教材_SQL数据操作基础(二)
SQL数据操作基础(初级) netnova 于 -- :: 加贴在 数据库探讨: 为了建立交互站点,你需要使用数据库来存储来自访问者的信息.例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简 ...
- C Primer Plus(第五版)7
第 7 章 C 控制语句:分支和跳转 在本章中你将学习下列内容: · 关键字:if(如果),else(否则),switch(切换),continue(继续),break(中断), case(情况),d ...
- [HDU 5113] Black And White (dfs+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5113 题目大意:给你N*M的棋盘,K种颜色,每种颜色有c[i]个(sigma(c[i]) = N*M) ...
- Arch Linux 修改主机名称
Hostname Set the hostname to your liking (e.g. arch): # echo myhostname > /etc/hostname Add the s ...
- Spark History Server配置使用
Spark history Server产生背景 以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息:但该WEB ...
- android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件
在开发中遇到ScrollView嵌套ListView的问题,最开始发出不能全屏,效果是这样的: 但我想要的效果是这样的: 下面看一下布局文件: <?xml version="1.0&q ...
- android 开发进阶 自定义控件-仿ios自动清除控件
先上图: 开发中经常需要自定义view控件或者组合控件,某些控件可能需要一些额外的配置.比如自定义一个标题栏,你可能需要根据不同尺寸的手机定制不同长度的标题栏,或者更常见的你需要配置标题栏的背景,这时 ...