struts2.1.6教程九、文件上传下载(了解)
首先建立struts2UpDownLoad项目,搭建好struts2基本的开发环境。
- 上传实例
步骤一:upload.jsp代码如下:
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="file" label="上传的头像(格式:jpg,gif,bmp)"></s:file>
<s:submit value="上传"/> <s:reset value="取消"/>
</s:form>
注意:在form标签中我们用到了enctype实体,这是上传时必须用到得。
步骤二,建立struts.xml。对upload.action的配置如下:
<action name="upload" class="com.asm.UploadAction">
<param name="savePath">img</param>
<result>/upSuc.jsp</result>
<result name="input">upload.jsp</result>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">1024*1024</param>
<param name="fileUpload.allowedTypes">
image/bmp,image/pjpeg,image/gif
</param>
</interceptor-ref>
</action>
在这里唯一需要说明的是<interceptor-ref>下的参数问题,在以前如果要为某个特定的拦截器传递参数需要在<interceptor>下配置pararm参数,在此处我们用.形式来配置fileUpload拦截器的参数。这用做即可以保证默认的拦截器栈起作用,也可以向fileUpload拦截器传递参数。第一个参数是限制上传图片的大小(除了可以这样限制图片大小,也可以配置一个常量的方法来限制上传文件的大小,配置的内容为:<constant name="struts.multipart.maxSize" value="文件大小"/>),第二个参数是限制上传图片的格式只能为bmp,pjpeg,gif关于这些参数可以参看fileupload拦截器对应类的api文档。
另还需注意:在action下的“<param name="savePath">img</param>”代码可以为UploadAction的savePath字段传递值,这样作的好处是在项目正式发布后,我们可以通过修改struts.xml中的配置来灵活给savePath赋值。而如果直接在java源代码中初始化savePath的值,在项目运行后就不能简单修改。这种用法主要是为了给客户提供一个灵活可配的特定初始化方式。
步骤三、编写UploadAction,主要代码如下:
package com.asm;
public class UploadAction extends ActionSupport {
private String savePath;
private File file;
private String fileFileName;
private String fileContentType; public String execute() throws Exception {
String path=ServletActionContext.getServletContext().getRealPath(savePath);
String savaFileName=path+"\\"+fileFileName;
//System.out.println(savaFileName); BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try{
bis=new BufferedInputStream(new FileInputStream(file));
bos=new BufferedOutputStream(new FileOutputStream(savaFileName)); byte []buf=new byte[(int) file.length()];
int len=0;
while((len=bis.read(buf))!=-1){
bos.write(buf,0,len);
}}catch(Exception e){
e.printStackTrace();
}finally{
if(bis!=null)
bis.close();
if(bos!=null)
bos.close();
}
return SUCCESS;
}
...省略以上四个字段的get/set方法
}
说明:其实上传的难点就是在此action的处理上。首先是从配置文件中读取文件的保存路径,然后联合fileFileName(命名规则是上传的文件对应的字段名+FileName,如果要得到上传文件的类型,固定的写法应是上传的文件对应的字段名+ContentType,比如这里应为fileContentType)来确定完整的保存路径,并最终为创建BufferedOutputStream作准备。BufferedInputStream是通过前台upload.jsp页面传递的file构建。特别要注意处理流,如果书写不当可能会使上传文件循环写入,使得硬盘容量不够。还要注意对流的关闭问题。 补充:关于文件的操作可以使用commons-io.jar包的FileUtils类下的copyFile方法来进行文件的拷贝,比如这里调用copyFile方法(file,要保存的目录)
上传成功后,upSuc.jsp的主要内容如下:
<body>
<h4>上传成功,以下是你刚上传的图片:</h4>
<img src="<%=request.getContextPath() %>/<s:property value="savePath+'/'+fileFileName"/>"> <br>
保存路径为:<s:property value="savePath+'/'+fileFileName"/>
</body>
说明:当上传成功后,会显示上传的图片。
扩展实例:如果想上传多个文件,可以在Action中使用File[] files来接受上传的文件(jsp中对应的上传文件的参数均应为files)。对应的上传文件的名字,使用String[] fileFileName。然后循环files数组保存File文件对象。
2.下载实例
下载页面的doload.jsp的主要代码如下:
<a href="download.action?downloadName=img/a.bmp">下载图片</a><br>
<a href="download.action?downloadName=img/music.rar">下载千千静听</a><br>
对应的download action配置如下:
<action name="download" class="com.asm.DownloadAction">
<result name="success" type="stream">
<param name="inputName">targetFile</param>
<param name="contentType">
image/bmp,application/x-zip-compressed
</param>
</result>
</action>
说明:type类型指明了结果集为流类型,并且为流类型结果集配置了参数,inputName指定流的来源,这里来源为targetFile,所以在下面的Action中有getTargetFile方法, contentType指明下载时的文件类型。
DownloadAction的主要代码如下:
package com.asm;
public class DownloadAction extends ActionSupport {
private String downloadName;
public String execute() throws Exception {
return SUCCESS;
} public InputStream getTargetFile(){
return ServletActionContext.getServletContext().getResourceAsStream(downloadName);
} public void setDownloadName(String downloadName) {
this.downloadName = downloadName;
}
}
说明:下载实例在此略作了解,具体可以借助apache组织提供的上传下载开源项目理解。
struts2.1.6教程九、文件上传下载(了解)的更多相关文章
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- Struts2实现文件上传下载功能(批量上传)
今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...
- Struts2中文件上传下载实例
1.单文件上传 jsp页面: <!-- 单文件上传 --> <form action="Fileupload.action" method="post& ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- ssh框架文件上传下载
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2013第38周日Java文件上传下载收集思考
2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...
- 文件上传下载样式 --- bootstrap
在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框 ...
- 使用Typescript重构axios(二十五)——文件上传下载进度监控
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
随机推荐
- mysql 主从同步 实现增量备份
数据库复制 replication 的实现原理 1:主服务器凡运行语句,都产生一个二进制日志 binlog 2:从服务器不断读取主服务器的binlog 3:从主服务读取到的binlog,转换为自身可执 ...
- Android批量验证渠道、版本号
功能:可校验单个或目录下所有apk文件的渠道号.版本号使用说明:1.copy需要校验的apk文件到VerifyChannelVersion目录下2.双击运行VerifyChannelVersion.b ...
- 利用原生JS判断组合键
<script type="text/javascript"> var isAlt = 0; var isEnt = 0; document.onkeydown = f ...
- SysTick定时器
SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值.只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.下边小结了SysTick的相关寄 ...
- 关于centos 7 systemctl自定义服务笔记
通过添加 Restart=always RestartSec=2s StartLimitBurst=10 实现systemctl服务崩溃自动重启
- php 启动过程 - sapi MSHUTDOWN 过程
php 启动过程 - sapi MSHUTDOWN 过程 概述 当服务器关闭时, 会走到 sapi MSHUTDOWN 过程 注册过程 本次内容是在 php 启动过程 - sapi MINIT 过程 ...
- 随应潮流-基于ABP+Angulsrjs现代化应用软件开发框架(1)-总体介绍
前言 近几年一直从事电子政务和企业管理软件的外包开发工作,深感开发技术更新之快,尤其随着移动互联网的发展,前端技术发展更是一日千里. 现在随便一个项目都要求多端使用(PC+App+微信),如果没有一个 ...
- linux重要的守护进程
重要的守护进程 守护进程(Daemon)通常会随系统启动时激活并随系统关闭时停止,一直在系统后台中默默为用户提供服务: 守护进程名称 用处 crond 计划任务 dhcpd 动态IP地址分配服务(DH ...
- 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- [KISSY5系列]KISSY5安装使用(二)
上篇文章,我们遗留的一个问题就是,请求数量有点多,虽然现在的浏览器的请求资源都是并发的.但是我们还是尽量减少请求量. 但是KISSY里面这个问题我们怎么解决呢,其实还是从data-config=&qu ...