struts2文件上传下载详解

基于Struts2实现文件上传与下载功能详解 对于大文件下载,直接加载整个文件流可能造成内存溢出或响应缓慢。通过HTTP协议的Range头,可以实现分段下载与断点续传。= -1) {// 不返回视图。 阅读详情

这个讲解的很棒!转载地址:http://blog.youkuaiyun.com/chen_zw/article/details/7482916


struts2没有提供自己的请求解析器,也就是说,struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来,但struts2在原有的上传解析器上作了进一步封装,更进一步简化了文件上传,Struts2的struts.properties配置文件中,配置struts2的上传文件解析器struts.multipart.parser=jakarta(srtuts2默认),也可以设置为常用的cos,pell等。

       struts2实现上传下载所必须的2个jar包:commons-fileupload-xxx.jar和commons-io-xxx.jar。

一、文件上传

  1.  单文件上传

(1)单文件上传表单视图:

[java]  view plain  copy
 print ?
  1. <body>  
  2.  <form action="/test/upload.action" enctype="multipart/form-data" method="post">  
  3.      <input name="uploadfile" type="file">  
  4.      <input type="submit" value="上传">  
  5.  </form>  
  6. </body>  

注意:表单必须设置enctype="multipart/form-data"和method="post"属性,否则上传会出错。

2. 单文件上传Action类

[java]  view plain  copy
 print ?
  1. /** 
  2.  * 文件上传类 
  3.  * @author Ye 
  4.  * 
  5.  */    
  6.  public class UploadAction extends ActionSupport{  
  7.   
  8.         <!--获取上传文件,名称必须和表单file控件名相同-->       
  9.          private File uploadfile;  
  10.   
  11.          <!--获取上传文件名,命名格式:表单file控件名+FileName(固定)-->      
  12.          private String uploadfileFileName;  
  13.   
  14.          //获取上传文件类型,命名格式:表单file控件名+ContentType(固定)   
  15.          private String uploadfileContentType;       
  16.   
  17.          ...//省略属性的getter、setter方法  
  18.         
  19.          //方法一:使用FileUtils的copyFile来实现文件上传  
  20.          public String upload() throws IOException  
  21.          {  
  22.                  //设置上传文件目录    
  23.                  String realpath = ServletActionContext.getServletContext().getRealPath("/image");  
  24.   
  25.                  //判断上传文件是否为空      
  26.                  if(uploadfile!=null)  
  27.                  {  
  28.                          //设置目标文件(根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例)  
  29.                          File savefile = new File(realpath,uploadfileFileName);  
  30.   
  31.                          // 判断上传目录是否存在            
  32.                          if(!savefile.getParentFile().exists())  
  33.                                savefile.getParentFile().mkdirs();  
  34.   
  35.                          //把文件uploadfile 拷贝到 savefile 里,FileUtils类需要commons-io-x.x.x.jar包支持  
  36.                          FileUtils.copyFile(uploadfile,savefile);  
  37.   
  38.                          //设置request对象值       
  39.                          ActionContext.getContext().put("message", "上传成功!");  
  40.                  }  
  41.                  return "success";  
  42.           }  
  43.   
  44.           //方法二:使用文件流来实现文件上传  
  45.           public String upload() throws IOException  
  46.           {  
  47.                 FileOutputStream fos = new FileOutputStream("D:\\"+uploadfileFileName);  
  48.           
  49.                 FileInputStream fis = new FileInputStream(uploadfile);  
  50.           
  51.                 byte[] buffer = new byte[1024];  
  52.           
  53.                 int len = 0;  
  54.           
  55.                 while((len=fis.read(buffer))>0)  
  56.                 {  
  57.                    fos.write(buffer,0,len);  
  58.                 }  
  59.                 return "success";  
  60.            }  
  61.   
  62.  }  

注意:记得Action类要继承ActionSupport。

3.  配置struts.xml文件

[html]  view plain  copy
 print ?
  1. <package name="hello" namespace="/test" extends="struts-default">  
  2.     <action name="upload" class="action.UploadAction" method="upload">    
  3.      
  4.         <!-- 在struts.xml文件中使用constant元素指定在全局的struts.properties文件中自定义出错信息,value值为*.properties类型的文件名 -->  
  5.         <constant name="struts.custom.i18n.resources" value="struts"></constant>   
  6.   
  7.         <!-- 配置fileUpload的拦截器 -->  
  8.         <interceptor-ref name="fileUpload">  
  9.    
  10.            <!-- 配置允许上传的文件类型 -->  
  11.            <param name="allowedTypes">image/bmp,image/gif,image/jpg</param>      
  12.         
  13.            <!--配置允许上传文件的扩展名,如果有多个用","隔开 -->      
  14.            <param name="allowedExtensions">txt,excel,ppt</param>    
  15.                 
  16.            <!-- 配置允许上传的文件大小,最大为20k -->  
  17.            <param name="maximumSize">20480</param>  
  18.   
  19.         </interceptor-ref>  
  20.   
  21.         <!-- 配置struts2的默认拦截器栈  -->  
  22.         <interceptor-ref name="defaultStack"></interceptor-ref>  
  23.   
  24.        <result>/success.jsp</result>  
  25.   
  26.        <!-- 上传失败时返回的视图页面 -->  
  27.        <result name="input">/index.jsp</result>     
  28.   
  29.      </action>  
  30. </package>  
注意:(1) 拦截器实现要在UploadAction类中继承ActionSupport,否则拦截器无效。

          (2) 必须显示配置引用Struts默认的拦截器栈:defaultStack

          (3) struts的默认上传文件大小为2M,可以用常量来控制扩大上传限制:

                 <constant name="struts.multipart.maxSize" value="104857600"></constant>   //设置上传上限为10M

                  真正的视频网站会使用插件而不是这种web上传的方式上传文件,因为Web上传的稳定性差。

          (4) 在失败的页面视图中使用<s:fielderror/>标签可以输出上传失败的原因,错误信息默认是struts提供的英文字符,如果需要将其转换为中文字符,可在国际化资源文件中配置以下代码:

struts.properties:

[html]  view plain  copy
 print ?
  1. struts.messages.error.content.type.not.allowed = 上传的文件类型不正确           
  2. struts.messages.error.file.too.large= 上传的文件太大  
  3. struts.messages.error.uploading=上传时出现未知错误  

  2.  多文件上传:

   多文件上传原理同单文件上传,主要是在action中定义File[]数组来接收多文件数据。

(1)多文件上传表单视图:

[html]  view plain  copy
 print ?
  1. <body>  
  2.    <s:form action="multiUpload" method="post" namespace="/test3" enctype="multipart/form-data">  
  3.        <s:file name="uploadfile" label="文件1"></s:file>  
  4.        <s:file name="uploadfile" label="文件2"></s:file>  
  5.        <s:file name="uploadfile" label="文件3"></s:file>  
  6.        <s:file name="uploadfile" label="文件4"></s:file>  
  7.        <s:submit value="上传"></s:submit>  
  8.     </s:form>  
  9. </body>   

(2)多文件上传Action类:

[java]  view plain  copy
 print ?
  1. public class UploadAction extends ActionSupport {  
  2.     private File[] uploadfile;  
  3.     private String[] uploadfileFileName;  
  4.     private String[] uploadfileContentType;  
  5.   
  6.         ...//省略属性的getter、setter方法  
  7.   
  8.         //方法一:  
  9.     public String upload() throws IOException {  
  10.         String realpath = ServletActionContext.getServletContext().getRealPath("/image");  
  11.         if (uploadfile != null) {  
  12.             File savepath = new File(realpath);  
  13.             if (!savepath.exists())  
  14.                 savepath.mkdirs();  
  15.             for (int i = 0; i < uploadfile.length; i++) {  
  16.                 File savefile = new File(realpath, uploadfileFileName[i]);  
  17.                 FileUtils.copyFile(uploadfile[i], savefile);  
  18.             }  
  19.             ActionContext.getContext().put("message", "上传成功!");  
  20.         }  
  21.         return "success";  
  22.     }  
  23.   
  24.         //方法二:  
  25.         public String upload() throws IOException  
  26.         {  
  27.              for(int i = 0 ; i < uploadfile.length; i ++)  
  28.              {  
  29.                     FileOutputStream fos = new FileOutputStream("D:\\"+uploadfileFileName[i]);  
  30.               
  31.                     FileInputStream fis = new FileInputStream(uploadfile[i]);  
  32.               
  33.                     byte [] buffer = new byte[1024];  
  34.               
  35.                     int len = 0 ;  
  36.               
  37.                     while((len = fis.read(buffer))>0)  
  38.                     {  
  39.                        fos.write(buffer,0,len);  
  40.                     }  
  41.                       
  42.                }  
  43.                return "success";  
  44.          }  
  45.   
  46.  }  

二、文件下载

(1)文件下载Action类

[java]  view plain  copy
 print ?
  1. public class DownloadAction extends ActionSupport {  
  2.       
  3.         //downloaPath属性用于封装被下载文件的路径  
  4.         private String downloadPath;  
  5.   
  6.         //初始化要保存的文件名  
  7.         private String filename;  
  8.   
  9.         //文件保存路径  
  10.         private String savePath;  
  11.   
  12.         public String getSavePath() {  
  13.             return savePath;  
  14.         }  
  15.   
  16.         public void setSavePath(String savePath) {  
  17.             this.savePath = savePath;  
  18.         }    
  19.        
  20.         public String getFilename() {  
  21.                return filename;  
  22.         }  
  23.   
  24.         public void setFilename(String filename) {  
  25.                this.filename = filename;  
  26.         }  
  27.   
  28.         public void setDownloadPath(String downloadPath) {  
  29.         this.downloadPath = downloadPath;  
  30.         }  
  31.   
  32.        // 隐含属性 targetFile ,用于封装下载文件  
  33.     public InputStream getTargetFile() throws FileNotFoundException  
  34.     {  
  35.         return new FileInputStream(downloadPath);  
  36.     }  
  37.       
  38.     public String execute()  
  39.     {  
  40.         return "success";  
  41.     }  
  42.   
  43. }  
(2)配置struts.xml文件:

[html]  view plain  copy
 print ?
  1. <package name="test3_download" extends="struts-default">   
  2.   <action name="download" class="com.action.DownloadAction" method="execute">  
  3.   
  4.      <!-- 对Action类中的文件路径参数设置初始值 -->  
  5.      <param name="downloadPath">${savePath}</param>  
  6.           
  7.         <!-- 设置一个stream类型的result -->  
  8.         <result name="success" type="stream">  
  9.             
  10.            <!-- 设置下载文件的输入流属性名 -->  
  11.            <param name="inputName">targetFile</param>  
  12.   
  13.            <!-- 设置下载文件的文件类型,配置后可以直接在浏览器上浏览,省略则会弹出是保存文件还是打开文件信息的对话框 -->  
  14.           <!-- <param name="contentType">image/jpg</param> -->  
  15.   
  16.            <!-- 设置下载文件的文件名 -->  
  17.            <param name="contentDisposition">attachment;filename=${filename}</param>  
  18.   
  19.            <!-- 设置下载文件的缓冲 -->  
  20.            <param name="bufferSize">2048</param>  
  21.       </result>  
  22.    </action>  
  23.  </package>  
struts2 upload file 立即下载

相关推荐

struts2解析文件

关于学习struts2的一些资料,提供给大家希望对大家有所帮助。

FileNotFoundException 问题的解决

放在resource目录下的一个文件,在启动程序的时候会读取文件的路径 Object.class.getResource("/toDeleteRoleId.txt").getPath() 代码如图,本地idea可以正常运行,但是打包后使用python脚本 用命令执行 包FileNotFoundException,如下图 注意到输出的文件路径是在jar包的下级目录,解压jar包...

wsen1229的博客 8098

基于STM32的红外测温系统设计

为了实现本次的毕业设计,我搜集了大量的文献与资料,通过这些资料了解到红外测温的优点,与实现所需的基本器件,并设计了几个方案,最终选择了STM32作为主控芯片,为此还查阅了关于STM32的资料,在此次设计中采用的是MLX90614医用红外测温模块,通过查阅其数据手册了解其测量精度高且自带温度补偿,所以选择了该传感器作为红外测温模块,本次设计到此已经基本完成,硬件部分和软件部分的设计已基本完成。

weixin_112233的博客 1421

【异常处理】java.io.FileNotFoundException报错处理

程序已经部署到服务器上,注册时出现这个报错。 解决方案: 打开idea的project structure(Ctrl+Shift+Alt+S),点到artifact栏,发现下放显示lib没加到模块(具体怎么说的记不得啦),右边有个fix,加一下lib就好了。 如果用eclipse也考虑一下jar包的问题吧,有没有加到library。 ...

VICI的博客 2753

S32DS新建工程、编译调试下载、导入工程详细介绍

新建了一个工程之后,下面简单介绍下基本的UI界面。其中最左下角那个是界面,这个界面很重要,是图形化配置界面,然后可以根据这些配置自动生成代码。其中,左边那些配置文件,都是系统帮我们创建好了的,我们其实可以直接用就行。有PE工具的调试,以及Jlink工具的调试。我目前使用到PE工具调试可以查看寄存器值,而Jlink调试查看不了寄存器值。连接了开发板之后,点击Debug就可以吧程序下载到芯片上了,而且可以进入到调试界面。

luobeihai的博客 2万+

别再死记硬背公式了!用Multisim仿真软件,5分钟搞懂三极管放大电路的工作原理

本文介绍如何利用Multisim仿真软件快速掌握三极管放大电路的工作原理,避免死记硬背公式。通过动态实验和参数调整,直观理解三极管的工作状态和放大效果,提升学习效率和实践能力。

weixin_30566063的博客 568

java.io.FileNotFoundException

  java.io.FileNotFoundException: F:\software\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\emailRS\WEB-INF\images\1528947656681.png (系统找不到指定的路径。) at java.io.FileOut...

吃根草的博客 1393

你需要这样一个Ros软路由—— 路由器+外网+一号通ip线路=动态ip的WiFi信号

功能强大 管理便捷—给您全新的路由体验 一键更换指定线路or批量更换所有IP/MAC/SSID 自定义走本地网络策略的分流功能 设备批发价、不限制拨号账号服务商 强大的单设备/多设备IP去重功能 批量导入、管理一号通线路 一键任意切换5G_WiFi(推荐)/2.4G_WiFi(建议不用) 设备支持PPTP/L2TP/SSTP/openVP.N等协议 独家支持openVPN,适用于网络受限用户 支持自行接入AP和交换机扩容 一键打开/关闭所有虚拟WiFi 一键隐藏/显示设备WiFi...

米粒儿 4253

记一次FileNotFoundException异常

  同事提交了代码,就回去过春节了,今天,业务人员来说他昨天修改的东西有问题,要我处理。看了下日志,发现是这个很easy的异常 java.io.FileNotFoundException: \excel-templates\123 (系统找不到指定的路径。)   看错误信息,就知道是xls的模版在服务器上没有被程序获取到,又看了下git上是有的,那绝壁是运维哥哥的锅了。   果断吊运维去...

卖克的专栏 2542

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2730

struts2 进行文件上传下载详解,整合JSP

文件上传 表单 文件上传的表单要求 表单提交的方式必须是POST 表单中必须有表单元素:或struts2标签<s:file label=“xxx” name=“xxx”/> 表单的enctype属性必须是multipart/form-data 此处提供表单的enctype属性的3种值表示及其含义 (1)application/x-www-form-urlencoded,默认值,它只能...

qq_42301302的博客 450

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 840

Struts2.5文件上传和下载详解(一)

今天了解了文件的上传与下载,遇到了很多的问题,解决了一天终于也算是懂了一些。现在来分享一下。文件的上传1、要实现Struts2.5的文件上传功能,必须包含两个jar文件:commons-io-2.4.jar和commons-fileupload-1.3.3.jar2、在jsp文件的表单中,表单的method设置为:POST,enctype设置为multipart/form-data(此时浏览器采用二

Blank_Space 2555

【异常】Codybuddy Error Code: 14003 too many requests 限流报错问题排查与解决指南

14003报错本质为服务端限流拦截,并非账号封禁或程序致命故障,90%以上的场景可通过等待冷却+规范使用行为解决。通过本文的排查步骤,可快速恢复工具使用,同时规避后续重复触发该问题。

奶爸的编程之路,也就一周冷个三天 1253

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Struts2 文件上传/下载 详解

文件上传 1,上传文件处理类(Action) 继承 ActionSupport package com.wang.action; import java.io.File; /*import java.io.FileInputStream; import java.io.FileOutputStream;*/ import java.io.IOException; import or...

AiT_Boy的博客 231

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java轻量级MVC框架Struts2 2.5详解(6)struts2文件上传和下载

一、Struts2中简单的文件上传 1):表单必须使用POST方式提交; 2):使用二进制编码:enctype="multipart/form-data"; 3):&lt;input type="file" name=""/&gt;; 4):通过struts2标签生成表单 5):Action中通过Set()方法获得表单中的数据 6):将通过网络获...

葡萄藤的博客 2973

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVAWEB开发之Struts2详解(三)——Struts2信息国际化、自定义拦截器以及Struts2文件上传和下载详解

Struts2中的信息国际化 1.国际化原理?什么是国际化? 同一款软件,可以为不同用户,提供不同的语言界面(国际化软件) 需要一个语言资源包(很多properties文件,每个properties文件 针对一个国家或一种语言,通过Java程序根据来访者国家语言,自动读取不同的properties文件) 2.资源包编写  properties文件命名:基本名称_语言(小写)_国家(大写)

1056

细谈struts2(十三)struts2实现文件上传和下载详解

文件上传和文件下载是我们在web应用程序中常用的两个功能,在java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,首先我们来看文件上传:  文件上传          文件上传我们首先应该注意的是在上传页面的表单,这个表单也是有讲究的,由于我们提交表单的数据中有文件上传,所以这个表单的所使用的编码类型就不能是原

qq_29663071的博客 385

Struts2.5文件上传和下载详解(二)

文件下载2333~~(╯﹏╰),下载问题有好多,网上给出的方法也层次不穷,比较凌乱,参考了一下其他博主的一些资料,来写一篇比较完整的关于Struts2的文件下载。Struts2控制文件的下载,是通过stream结果类型,该结果类型将使用文件下载作为响应。stream结果类型需要在struts.xml中进行配置,它需要指定4个属性 contentType:指定被下载文件的类型。若给出详细的类型,如

Blank_Space 2350

7、struts2命名空间、各种配置元素详解及文件上传下载

1、package元素,除了有name和extends属性,还有abstract属性:这个属性说明这个包是个抽象包,类似抽象类,不能直接使用,只能定义一个子包,然后extends这个abstract包。struts-default这个package就是abstract的,因此需要我们继承这个包来使用。 namespace属性:起到命名空间分割的作用。通常将namespace的属性值定义成页面所在

kaoa000的专栏——非淡泊无以明志,非宁静无以致远 2138

Struts2总结---文件上传和下载详解 (9)

文件上传和文件下载是我们在web应用程序中常用的两个功能,在Java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,首先我们来看文件上传:  文件上传          文件上传我们首先应该注意的是在上传页面的表单,这个表单也是有讲究的,由于我们提交表单的数据中有文件上传,所以这个表单的所使用的编码类型就不能是原

helongzhong的博客 514

Struts2应用开发详解--14、文件上传和下载

一、文件上传   Struts2的文件上传需要commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar文件。 第一个为文件上传组件,第二个为文件操作组件。 各部分代码必须遵守如下规则 1、页面代码片段如下 &lt;form enctype="multipart/form-data" action="/test/upfile.action" me...

比特的专栏 150
上一篇: window打开mysql命令行模式
下一篇: java io 一些总结
Kindle_code
博客等级 码龄12年 21粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值