Struts2基础学习(六)—文件的上传和下载
一、文件的上传
1.单个文件上传
Struts2使用拦截器完成了文件的上传,而且底层使用的也是FileUpload开源组件。
客户端注意事项:
(1)method="post"
(2)enctype="multipart/form-data"
(3)<intput type="file" name="photo">
在Action编写文件上传时,需要定义三个属性。
(1)文件类型File,属性名与表单中的file的name属性名一致。
(2)字符串类型,属性名: name属性名 + FileName eg: photoFileName 。
(3)字符串类型,属性名: name属性名 + ContentType eg: photoContentType 。
最后要为上述的三个属性名提供getXXX 和SetXXX方法。然后通过FileUtils的copyFile方法进行文件复制,将文件上传到服务器。
index.jsp
<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片"/>
<s:submit value="上传"/>
</s:form>
UploadAction.java
public class UploadAction extends ActionSupport{
private String username;
private File photo;
private String photoFileName;// 上传的文件名
private String photoContentType;// 上传的文件的MIME类型
public String uploadOne() throws IOException{
System.out.println("username = " + username + "\nphotoName = " + photoFileName + "\nphotoContentType = "
+ photoContentType);
// 上传
String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
FileUtils.copyFile(photo,new File(storeDir,photoFileName));
return SUCCESS;
}
public String getPhotoFileName(){
return photoFileName;
}
public void setPhotoFileName(String photoFileName){
this.photoFileName = photoFileName;
}
public String getPhotoContentType(){
return photoContentType;
}
public void setPhotoContentType(String photoContentType){
this.photoContentType = photoContentType;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public File getPhoto(){
return photo;
}
public void setPhoto(File photo){
this.photo = photo;
}
}
结果:

2.文件上传存在的问题
文件上传总大小默认是2M,如果超过了2M,程序会报异常,可使用<s:actionError>查看具体信息。
(1)解决总大小的设置,找到常量
struts.multipart.parser=jakarta 默认文件上传解析器,就是FileUpload组件
struts.multipart.saveDir= 文件上传的临时文件存储目录
struts.multipart.maxSize=2097152 文件上传的最大值(总大小),默认是2M
在struts.xml设置常量,修改文件上传的默认总大小
<!-- 配置上传文件的大小 -->
<constant name="struts.multipart.maxSize" value="5000000"/>
(2)还可以通过配置拦截器来设置文件上传
<action name="uploadOne" class="com.kiwi.action.UploadAction" method="uploadOne"> <interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型,多个用","分隔 -->
<param name="allowedTypes">
image/bmp,image/png,image/gif,image/jpeg,image/jpg
,image/x-png,image/pjpeg
</param>
<!-- 配置允许上传的文件大小,单位字节 -->
<param name="maximumSize">102400</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" /> <result name="success">/success.jsp</result> </action>
(3)修改显示错误信息的资源文件信息
第一步:创建新的资源文件例如message_zh_CN.properties,放置在src下在该资源文件中增加如下信息:
struts.messages.error.uploading=上传错误: {0}
struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}
第二步:在struts.xml文件加载该资源文件
<constant name="struts.custom.i18n.resources" value="message"/>
3.多文件上传
在JSP的页面上提供多组文件上传的输入框,选择多个文件上传。
index.jsp
<s:form action="uploadOne" method="post" enctype="multipart/form-data">
<s:textfield name="username" label="用户名"/>
<s:file name="photo" label="照片1"/>
<s:file name="photo" label="照片2"/>
<s:file name="photo" label="照片3"/>
<s:submit value="上传"/>
</s:form>
UploadAction.java
public class UploadAction2 extends ActionSupport{
private String username;
private File[] photo;
private String[] photoFileName;// 上传的文件名
private String[] photoContentType;// 上传的文件的MIME类型
public String uploadOne() throws IOException{
// 上传
String storeDir = ServletActionContext.getServletContext().getRealPath("/upload");
if(photo != null && photo.length > 0){
for(int i = 0;i < photo.length;i++){
FileUtils.copyFile(photo[i],new File(storeDir,photoFileName[i]));
}
}
return SUCCESS;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public File[] getPhoto(){
return photo;
}
public void setPhoto(File[] photo){
this.photo = photo;
}
public String[] getPhotoFileName(){
return photoFileName;
}
public void setPhotoFileName(String[] photoFileName){
this.photoFileName = photoFileName;
}
public String[] getPhotoContentType(){
return photoContentType;
}
public void setPhotoContentType(String[] photoContentType){
this.photoContentType = photoContentType;
}
}
二、文件的下载
index.jsp
<s:a action="download?filename=1.jpg">1.jpg</s:a> <br>
<s:a action="download?filename=2.jpg">2.jpg</s:a><br>
<s:a action="download?filename=3.jpg">3.jpg</s:a><br>
struts.xml
<!-- 文件下载 -->
<action name="download" class="com.kiwi.action.DownloadAction">
<result name="success" type="stream">
<!-- 设置文件名称的MIME类型,值不是固定的,值是动态的 -->
<param name="ContentType">${contentType}</param>
<!-- 设置弹出下载的窗口,文件名称是动态的值 -->
<param name="ContentDisposition">attachment;filename=${downloadFilename}</param>
</result>
</action>
DownloadAction.java
public class DownloadAction extends ActionSupport{
//接受文件的名称
private String filename;
/*
* get请求的中文乱码问题需要自己解决
*/
public void setFilename(String filename) throws UnsupportedEncodingException{
this.filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
}
/*
* 提供一个方法,能获取的文件的MIME类型
*/
public String getContentType(){
return ServletActionContext.getServletContext().getMimeType(filename);
}
/*
* 返回的是文件的名称
* 在弹出的下载窗口中,显示中文会有乱码的问题
* 判断浏览器,根据不同的编码解决乱码的问题
*/
public String getDownloadFilename() throws IOException{
// 先获取user-agent头信息
String agent = ServletActionContext.getRequest().getHeader("user-agent");
// 调用该方法,编码
String name = this.encodeDownloadFilename(filename, agent);
return name;
}
/*
* 根据user-agent的头,和文件的名称,解决中文文件名编码的问题
*/
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;
}
/*
* 提供一个方法名称必须是getInputStream()方法
*/
public InputStream getInputStream(){
// 获取要下载的文件的输入流,返回
return ServletActionContext.getServletContext().getResourceAsStream("/download/"+filename);
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
}
结果:

Struts2基础学习(六)—文件的上传和下载的更多相关文章
- 【JavaWeb学习】文件的上传和下载
一.文件上传 1.1.概述 实现web开发中的文件上传功能,需完成如下二步操作: 在web页面中添加上传输入项 在servlet中读取上传文件的数据,并保存到本地硬盘中 如何在web页面中添加上传输入 ...
- SpringMVC 学习笔记(文件的上传和下载)
在web项目中会遇到的问题:文件上传 文件上传在前端页面的设置:form表单 设置 input 类型 文件上传的请求方式要使用post,要将enctype设置为multipart/form-data ...
- Struts2 - 文件的上传和下载
1. 前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2. 具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ...
- JavaWeb框架_Struts2_(七)----->文件的上传和下载
这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量 ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- 初学Java Web(7)——文件的上传和下载
文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...
- jsp+servlet实现文件的上传和下载
实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...
- java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
- Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载
Python 进行 SSH 操作,实现本地与服务器的链接,进行文件的上传和下载 2018年5月26日 19:03 阅读 375 评论 7 我本地和服务器的连接一直使用的是 Xshell 5,而在与服务 ...
随机推荐
- 在Windows Server2016里通过Hyper-V安装Liunx Container
Windows Server2016正式发布已经有一段时间了.无可厚非,原生Docker的支持是这个版本一个非常大的亮点. Windows Container 的安装在网上有很多教程,我这里不过多的描 ...
- 推荐几款主流的Css Reset
1.Eric Meyer’s “Reset CSS”(重置的很极端) 官方网址:CSS Tools: Reset CSS 2.HTML5 Doctor CSS Reset 官方网址:HTML5 Res ...
- Dijkstra算法——单源最短路径问题
学习一个点到其余各个顶点的最短路径--单源最短路径 Dijkstra算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向 ...
- .net 爬虫技术
关于爬虫 从搜索引擎开始,爬虫应该就出现了,爬的对象当然也就是网页URL,在很长一段时间内,爬虫所做的事情就是分析URL.下载WebServer返回的HTML.分析HTML内容.构建HTTP请求的模拟 ...
- Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)
加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...
- SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)
前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...
- loadrunner入门篇-Analysis 分析器
analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来分析性能测试结果的数据图,但并不一定要对每个视图进行分析,可以根据实际情况选择相关的数据视图进行分析, ...
- wemall app商城源码Android 获取XML网络数据并绑定到ListView
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Android 获取XML网络数据并绑定到Li ...
- 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1347 Solved: 724[Submit][Stat ...
- (1)写给Web初学者的教案-----学习Web的知识架构
1:学习Web的知识架构 前文中我们简单的介绍了一些关于Web的基本知识,这里任老师再次强调一下凡是用浏览器打开的网站我们就称之为Web应用程序(B/S结构).除此之外其它需要下载安装的软件或是手机 ...