Struts2实现文件上传和下载

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.1.jar

struts2单文件上传:

首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框

   <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,  不然就会以二进制文本上传到服务器端-->   <form action="fileUpload.action" method="post" enctype="multipart/form-data">username: <input type="text" name="username"><br>file: <input type="file" name="file"><br><input type="submit" value="submit"></form>

接下来是FileUploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:

public class FileUploadAction extends ActionSupport
{private String username;   //注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件private File file;//提交过来的file的名字private String fileFileName;//提交过来的file的MIME类型private String fileContentType;public String getUsername(){return username;}public void setUsername(String username){this.username = username;}public File getFile(){return file;}public void setFile(File file){this.file = file;}public String getFileFileName(){return fileFileName;}public void setFileFileName(String fileFileName){this.fileFileName = fileFileName;}public String getFileContentType(){return fileContentType;}public void setFileContentType(String fileContentType){this.fileContentType = fileContentType;}@Overridepublic String execute() throws Exception{String root = ServletActionContext.getServletContext().getRealPath("/upload");InputStream is = new FileInputStream(file);OutputStream os = new FileOutputStream(new File(root, fileFileName));System.out.println("fileFileName: " + fileFileName);

    // 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同System.out.println("file: " + file.getName());System.out.println("file: " + file.getPath());byte[] buffer = new byte[500];int length = 0;while(-1 != (length = is.read(buffer, 0, buffer.length))){os.write(buffer);}os.close();is.close();return SUCCESS;}
}

首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。

文件上传后我们还需要将其下载下来,其实struts2的文件下载原理很简单,就是定义一个输入流,然后将文件写到输入流里面就行,关键配置还是在struts.xml这个配置文件里配置:

FileDownloadAction代码如下:

public class FileDownloadAction extends ActionSupport
{public InputStream getDownloadFile(){return ServletActionContext.getServletContext().getResourceAsStream("upload/通讯录2012年9月4日.xls");}@Overridepublic String execute() throws Exception{return SUCCESS;}
}

我们看,这个action只是定义了一个输入流,然后为其提供getter方法就行,接下来我们看看struts.xml的配置文件:

        <action name="fileDownload" class="com.xiaoluo.struts2.FileDownloadAction"><result name="success" type="stream"><param name="contentDisposition">attachment;filename="通讯录2012年9月4日.xls"</param><param name="inputName">downloadFile</param></result></action>

struts.xml配置文件有几个地方我们要注意,首先是result的类型,以前我们定义一个action,result那里我们基本上都不写type属性,因为其默认是请求转发(dispatcher)的方式,除了这个属性一般还有redirect(重定向)等这些值,在这里因为我们用的是文件下载,所以type一定要定义成stream类型,告诉action这是文件下载的result,result元素里面一般还有param子元素,这个是用来设定文件下载时的参数,inputName这个属性就是得到action中的文件输入流,名字一定要和action中的输入流属性名字相同,然后就是contentDisposition属性,这个属性一般用来指定我们希望通过怎么样的方式来处理下载的文件,如果值是attachment,则会弹出一个下载框,让用户选择是否下载,如果不设定这个值,那么浏览器会首先查看自己能否打开下载的文件,如果能,就会直接打开所下载的文件,(这当然不是我们所需要的),另外一个值就是filename这个就是文件在下载时所提示的文件下载名字。在配置完这些信息后,我们就能过实现文件的下载功能了。

struts2多文件上传:

其实多文件上传和单文件上传原理一样,单文件上传过去的是单一的File,多文件上传过去的就是一个List<File>集合或者是一个File[]数组,首先我们来看一下前端jsp部分的代码,这里我用到了jquery来实现动态的添加文件下载框以及动态的删除下载框:

    <script type="text/javascript" src="script/jquery-1.8.1.js"></script><script type="text/javascript">$(function(){$("#button").click(function(){var html = $("<input type='file' name='file'>");var button = $("<input type='button' name='button' value='删除'><br>");$("#body div").append(html).append(button);button.click(function(){html.remove();button.remove();})})})</script></head><body id="body"><form action="fileUpload2.action" method="post" enctype="multipart/form-data">username: <input type="text" name="username"><br>file: <input type="file" name="file"><input type="button" value="添加" id="button"><br><div></div><input type="submit" value="submit"> </form></body>

file的名字必须都命名成file才行,然后处理多文件上传的action代码如下:

public class FileUploadAction2 extends ActionSupport
{private String username;  //这里用List来存放上传过来的文件,file同样指的是临时文件夹中的临时文件,而不是真正上传过来的文件private List<File> file;  //这个List存放的是文件的名字,和List<File>中的文件相对应private List<String> fileFileName;private List<String> fileContentType;public String getUsername(){return username;}public void setUsername(String username){this.username = username;}public List<File> getFile(){return file;}public void setFile(List<File> file){this.file = file;}public List<String> getFileFileName(){return fileFileName;}public void setFileFileName(List<String> fileFileName){this.fileFileName = fileFileName;}public List<String> getFileContentType(){return fileContentType;}public void setFileContentType(List<String> fileContentType){this.fileContentType = fileContentType;}@Overridepublic String execute() throws Exception{String root = ServletActionContext.getServletContext().getRealPath("/upload");for(int i = 0; i < file.size(); i++){InputStream is = new FileInputStream(file.get(i));OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i)));byte[] buffer = new byte[500];@SuppressWarnings("unused")int length = 0;while(-1 != (length = is.read(buffer, 0, buffer.length))){os.write(buffer);}os.close();is.close();}return SUCCESS;}
}

这样同样将其写到一个输出流里面,这样我们就可以在文件夹里看到上传的多个文件了

接下来的文件下载就和刚才的文件下载一模一样,struts.xml也是一样的,这里就不再重复了

总结:总的来说,struts2提供的文件上传下载机制简化了我们很多代码,我们可以在以后的项目中使用该机制,同样我们也可以使用FileUpload组件来进行文件的上传,这个都是因个人爱好决定!

分类: Struts2
标签: java web, struts2
好文要顶 关注我 收藏该文  

xiaoluo501395377
关注 - 7
粉丝 - 1169

+加关注

15
1

« 上一篇:200多个js技巧代码(七)
» 下一篇:myeclipse下dwr.xml配置文件没有自动提示解决办法

posted @ 2012-10-26 11:45 xiaoluo501395377 阅读(93235) 评论(9) 编辑 收藏
评论列表
#1楼 2015-11-26 14:27 颖辉 
能不能说一下怎么上传文件到项目外的路径啊。不然每次重新部署都会清空文件
支持(0)反对(0)

#2楼 2015-11-26 14:32 颖辉 
还有500 指的是500字节码?太小了吧!~这个必须写死吗?这里写多少就能上传多大的文件了吗?
支持(0)反对(0)

#3楼 2015-12-09 21:41 任冠宇 
66666666666
支持(0)反对(0)

#4楼 2016-01-26 11:37 楪ぁ祈 
这个文件上传不用配置么
支持(0)反对(0)

#5楼 2016-11-26 16:49 菜鸟小生 
上面显示的那个时间怎么做的啊,求大神代码。760086174@qq.com
支持(1)反对(0)

#6楼 2016-12-08 16:34 What_Fuck_This_Is? 
这个主页左上角的时间真是不错
支持(0)反对(0)

#7楼 2017-03-28 15:05 NashAl 
这个上传不大行呀。NullPointerException会出异常,是什么原因呢。
支持(1)反对(0)

#8楼 2017-06-09 11:49 小詹小詹 
上传的时候出现了空指针异常,InputStream is = new FileInputStream(file);这一行出现的,判断上传文件名为空。
支持(0)反对(0)

#9楼 2017-07-11 10:56 蘇芳 
上传struts.xml没有配置,下载点击按钮没有请完善!!!

Struts2实现文件上传和下载相关推荐

  1. Struts2实现文件上传与下载

    Struts包+源码下载地址:点击打开链接   ,打不开,复制后面 http://struts.apache.org/download.cgi#struts223  ,历史版本:http://arch ...

  2. java struts 读取文件,java中Struts2 的文件上传和下载示例

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  3. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  4. Struts2文件上传与下载

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要写的是struts2 的文件上传与下载(中文文件名问题的解决).  使用的时候直接在地址栏中输入:http://loc ...

  5. Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL

    Struts2国际化处理 浏览器根据当前的语言环境自动查找对应的语言环境资源包, 使jsp显示合适的语言数据环境 Struts2实现国际化, 动作类必须继承ActionSupport 创建资源包 资源 ...

  6. struts2 文件上传与下载 (初始文件上传的底层技术)——struts2第七讲

    2019独角兽企业重金招聘Python工程师标准>>> 文件上传 struts2 注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初 ...

  7. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  8. Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载

    Struts2.3.5+Hibernate3+Spring3.1基于注解实现的的多文件上传,下载,这里是上传文件到数据库中,上传控件可以增加和删除,有需要的朋友可以看看. 以下是源码下载地址:http ...

  9. struts2完美实现文件上传和下载

    ## struts2完美实现文件上传和下载 ## 第一步:在webx项目lib目录下加入struts.jar包 asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3 ...

  10. Struts2之实现文件上传与下载

    当我们用struts2进行文件上传时,首先要将from表单的enctype属性进行重新设置.那么该属性的取值就是决定表单数据的编码方式.一般有三个属性取值: application/x-www-for ...

最新文章

  1. IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  2. java 内存泄漏_Java开发者必须知道的内存泄漏问题
  3. 推荐 10 个好用的 Vue3 的开源项目,开发效率又能提升了!
  4. 订单操作-分页查询所有订单
  5. html控制图的宽,用JointJS做一个简单的功能控制图
  6. Foxmail邮件字体大小怎么设置 Foxmail字体的设置方法
  7. vc 6.0添加c文件 fatal error C1010解决办法
  8. Security+ 学习笔记4 社会工程攻击
  9. 拓端tecdat|R语言stan泊松回归Poisson regression
  10. Ubuntu安装sqlmap
  11. xps in html5,学术干货 | 带你“一网捞尽”XPS 基本理论【绝对没有套路】
  12. 产品经理——工作规范指南
  13. 计算机关机后风扇还转,小编教你电脑关机后CPU风扇还在转怎么解决
  14. c语言中怎么将lg换成ln,lg和ln的换算(ln和log怎么转化)
  15. <3>【深度学习 × PyTorch】必会 线性代数 (含详细分析):点积 | 矩阵-向量积 | Hadamard积 | 矩阵乘法 | 范数/矩阵范数
  16. iOS UIDocumentPickerViewController页面列表底部有一截空白【已解决】
  17. python编程 迷你世界_迷你世界迷你编程下载
  18. CSP-J 2022复赛T2 解密--分析
  19. 计算机应用基础上机指导 教材,普通高等院校计算机优质平台课系列教材:计算机应用基础上机指导...
  20. android使用系统录音并寻找系统录音文件

热门文章

  1. android gsm功能,Android手机-GSM网络与WCDMA网络选择的设置
  2. 东方联盟创始人郭盛华:互联网守护神的传奇故事
  3. 记一次阿里云配置二级域名经历,及申请免费非工作用途SSL证书
  4. python中kwlist是什么意思_Python keyword.kwlist方法代碼示例
  5. 软件测试的意义究竟是什么?
  6. 导数与微分及简单例题
  7. 计算机就是三角函数,三角函数计算器
  8. 基于TVUE框架在中型移动端项目的直出同构实践
  9. java解析XML——Pull解析
  10. 企业如何软件商业化? .