1、单文件上传

单文件上传步骤:

1)创建上传jsp页面

文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded,比如:

  1. <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post"> 

2)创建处理文件上传Action类

  • 在Action类中声明相关属性:

    • 要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型,该属性用来保存临时文件;
    • 要声明[同名的属性]ContentType属性,类型是String类型,该属性表示上传文件的类型;
    • 要声明[同名的属性]FileName属性,类型是String类型,该文件表示要上传的文件;
    • 给所有属性提供get和set方法。
  • 在Action类中提供处理上传的方法:
    • 获取要保存文件的位置;
    • 在目标文件夹内,创建一个与上传文件同名的文件;
    • 通过FileUtils工具类提供copyFile()方法,将临时文件内容拷贝到目标文件夹下的那个同名的文件;
    • 调用保存临时文件的属性的delete()方法删除临时文件(也就是File类型属性的delete方法)。

3)配置struts.xml文件

  • 设置上传文件大小,Struts2默认上传文件总大小为2MB,超过文件总大小,跳转input视图,通过<s:actionError /> 回显错误信息,在struts.xml 设置上传总大小:

    1. <constant name="struts.multipart.maxSize" value="20000000"></constant>

    设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性

  • 在fileUpload拦截器中有三个属性:
    • protected Long maximumSize:可以设置每一个上传文件的大小
    • protected Set<String> allowedTypesSet:设置允许上传文件的类型
    • protected Set<String> allowedExtensionsSet:设置允许的上传文件的后缀名

可以在struts.xml文件中配置这些属性:

  1. <interceptor-ref name="defaultStack">
  2. <!--配置上传文件的大小,这里配置的是上传文件的单个大小-->
  3. <param name="fileUpload.maximumSize">20971520</param>
  4. <!-- 配置上传文件允许的类型-->
  5. <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
  6. <!-- 配置上传文件的扩展名-->
  7. <param name="fileUpload.allowedExtensions">.txt,.doc</param>
  8. </interceptor-ref>

允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致。

单文件上传示例:

1)创建jsp页面

  1. <body>
  2. <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
  3. 上传文件:<input type="file" name="upload">
  4. <input type="submit" value="上传">
  5. </form>
  6. </body>

2)创建Action类

  1. public class UploadAction extends ActionSupport {
  2. private File upload;
  3. private String uploadContentType;
  4. private String uploadFileName;
  5.  
  6. public File getUpload() {
  7. return upload;
  8. }
  9.  
  10. public void setUpload(File upload) {
  11. this.upload = upload;
  12. }
  13.  
  14. public String getUploadContentType() {
  15. return uploadContentType;
  16. }
  17.  
  18. public void setUploadContentType(String uploadContentType) {
  19. this.uploadContentType = uploadContentType;
  20. }
  21.  
  22. public String getUploadFileName() {
  23. return uploadFileName;
  24. }
  25.  
  26. public void setUploadFileName(String uploadFileName) {
  27. this.uploadFileName = uploadFileName;
  28. }
  29.  
  30. @Override
  31. public String execute() throws Exception {
  32. ServletContext sc = ServletActionContext.getServletContext();
  33. //获取要保存文件的位置
  34. String path = sc.getRealPath("/upload");
  35. //创建一个与上传文件同名的文件
  36. File file = new File(path, uploadFileName);
  37. //将临时文件内容拷贝到目标文件夹下的那个同名的文件
  38. FileUtils.copyFile(upload, file);
  39. //删除临时文件
  40. upload.delete();
  41. return SUCCESS;
  42. }
  43. }

3)配置struts.xml文件

  1. <struts>
  2. <constant name="struts.devMode" value="true" />
  3. <constant name="struts.multipart.maxSize" value="200000000"/>
  4. <package name="default" namespace="/" extends="struts-default">
  5. <action name="uploadAction" class="com.sunny.action.UploadAction">
  6. <result>/success.jsp</result>
  7. <result name="input">/error.jsp</result>
  8. <interceptor-ref name="defaultStack">
  9. <param name="fileUpload.maximumSize">20971520</param>
  10. <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
  11. <param name="fileUpload.allowedExtensions">.txt,.doc</param>
  12. </interceptor-ref>
  13. </action>
  14. </package>
  15. </struts>

4)上传文件界面

5)上传成功后会跳转到success.jsp页面

6)项目下的upload文件夹下会有上传的文件

上传问题信息国际化

Struts2上传问题信息默认的文件为在struts-message.properties下:

  1. struts.messages.error.uploading=Error uploading: {0}
  2. struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
  3. struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
  4. struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

要想实现中文显示,需要在Action类相同文件下创建ActionClassName.properties文件,其中ActionClassName为上传Action类的类名,文件内容修改为:

  1. struts.messages.error.uploading=上传错误: {0}
  2. struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}
  3. struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}
  4. struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

等号前面的内容固定,后面的内容可以自己写。

2、多文件上传

多文件上传的所有流程与单文件上传一致,但是需要注意的是:

  • 在页面中,虽然是多文件上传,但是页面中表单的name属性的值必须保持一致;
  • 在Action类中声明的相关属性,类型改成数组或者集合;
  • 在业务方法中,相关处理流程改成单文件上传的循环。

单文件上传示例:

1)创建jsp页面

  1. <body>
  2. <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
  3. 上传文件:<input type="file" name="upload"><br>
  4. 上传文件:<input type="file" name="upload"><br>
  5. 上传文件:<input type="file" name="upload"><br>
  6. 上传文件:<input type="file" name="upload"><br>
  7. <input type="submit" value="上传">
  8. </form>
  9. </body>

2)创建Action类

  1. public class UploadAction extends ActionSupport {
  2. private File[] upload;
  3. private String[] uploadContentType;
  4. private String[] uploadFileName;
  5.  
  6. public File[] getUpload() {
  7. return upload;
  8. }
  9.  
  10. public void setUpload(File[] upload) {
  11. this.upload = upload;
  12. }
  13.  
  14. public String[] getUploadContentType() {
  15. return uploadContentType;
  16. }
  17.  
  18. public void setUploadContentType(String[] uploadContentType) {
  19. this.uploadContentType = uploadContentType;
  20. }
  21.  
  22. public String[] getUploadFileName() {
  23. return uploadFileName;
  24. }
  25.  
  26. public void setUploadFileName(String[] uploadFileName) {
  27. this.uploadFileName = uploadFileName;
  28. }
  29.  
  30. @Override
  31. public String execute() throws Exception {
  32. ServletContext sc = ServletActionContext.getServletContext();
  33. //获取要保存文件的位置
  34. String path = sc.getRealPath("/upload");
  35. //创建一个与上传文件同名的文件
  36. for (int i = 0; i < upload.length; i++) {
  37. File file = new File(path, uploadFileName[i]);
  38. //将临时文件内容拷贝到目标文件夹下的那个同名的文件
  39. FileUtils.copyFile(upload[i], file);
  40. //删除临时文件
  41. upload[i].delete();
  42. }
  43. return SUCCESS;
  44. }
  45. }

3)配置struts.xml文件,和单文件上传的配置一样

  1. <struts>
  2. <constant name="struts.devMode" value="true" />
  3. <constant name="struts.multipart.maxSize" value="200000000"/>
  4. <package name="default" namespace="/" extends="struts-default">
  5. <action name="uploadAction" class="com.sunny.action.UploadAction">
  6. <result>/success.jsp</result>
  7. <result name="input">/error.jsp</result>
  8. <interceptor-ref name="defaultStack">
  9. <param name="fileUpload.maximumSize">20971520</param>
  10. <param name="fileUpload.allowedTypes">text/plain,application/msword</param>
  11. <param name="fileUpload.allowedExtensions">.txt,.doc</param>
  12. </interceptor-ref>
  13. </action>
  14. </package>
  15. </struts>

4)上传文件界面

5)上传成功后会跳转到success.jsp页面

6)项目下的upload文件夹下会有上传的文件

3、文件下载

Struts2学习笔记(十一)——文件上传的更多相关文章

  1. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  2. Django:学习笔记(8)——文件上传

    Django:学习笔记(8)——文件上传 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不 ...

  3. springmvc学习笔记--支持文件上传和阿里云OSS API简介

    前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...

  4. Javaweb学习笔记10—文件上传与下载

    今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容.       ...

  5. go web 第二天 学习笔记之文件上传

    package main import ( "crypto/md5" "fmt" "html/template" "io" ...

  6. SpringMVC学习笔记八:文件上传及多个文件上传

    SpringMVC实现文件上传需要加入jar包,commons-fileupload-1.3.1.jar,commons-io-2.2.jar 项目目录树: pom.xml加入需要的包 <pro ...

  7. Laravel 学习笔记之文件上传

    自定义添加磁盘——upload 位置:config/filesystems.php 'disks' => [ 'local' => [ 'driver' => 'local', 'r ...

  8. java学习笔记 (6) —— 文件上传

    1.新建upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  9. django学习笔记 多文件上传

    习惯了flask 再用django 还是不太习惯  好麻烦 配置文件也忒多了 不过还是要学的 之前只能一个一个文件长传,这次试试多个文件 不适用django的forms创建表单 直接在html中使用 ...

随机推荐

  1. 新浪微博share分享接口请求奇葩错误

    17年6月30号,微博正式转入牛逼状态: 限制原来的微博发布删除等接口:(想用就开套餐,不然别说话) 开放新的分享接口share,然而,在调用这个分享接口时候,就会出现各种各样的奇葩错误: 注意事项: ...

  2. 基于Centos开启samba服务

    1.安装samba服务: yum -y install samba samba-common samba-client2.查看samba服务状态: service smb status: 正常状态是: ...

  3. docker~Dockerfile方式生成控制台和Api项目的镜像

    回到目录 一些理论知识 将控制台程序和API程序部署到docker,然后运行它,这个首先要解决的问题就是如何在linux平台运行C#代码,哈哈,很古老的问题,事实上,对于这种问题早在几年前就已经有了解 ...

  4. nyoj_61: 传纸条(一)

    题目链接 使用双线dp,假设两个人同时从左上角移动到右下角,且满足路线不交叉,另k=x1+y1=x2+y2压缩状态进行优化.每次状态转移满足 x1,x2,y1,y2都在矩阵范围内,且(x2,y2)在相 ...

  5. poj_3468: A Simple Problem with Integers (树状数组区间更新)

    题目是对一个数组,支持两种操作 操作C:对下标从a到b的每个元素,值增加c: 操作Q:对求下标从a到b的元素值之和. 这道题也可以用线段树解,本文不做描述,下面分析如何用树状数组来解决这道题. 先把问 ...

  6. javascript王国的一次旅行,一个没有类的世界怎么玩转面向对象?

    1. 前言 作为Java 帝国的未来继承人,Java小王子受到了严格的教育, 不但精通Java语言.Java虚拟机.java类库和框架,还对各种官方的Java规范了如指掌. 近日他听说一个叫做Java ...

  7. ML(2)--感知机

    案例银行办信用卡--获得感知机 我们到银行办信用卡时,银行并不是直接就给你办卡的,而是会根据你的一些个人信息.消费信息.个人信誉等指标综合考虑后,才会决定是否给你办卡(不像现在银行办信用卡有点随意). ...

  8. echarts_部分图表配置_dataZoom精确控制显示数据数量

    echarts为我们提供了dataZoom组件,当数据过多时就有了它的用武之地,业务场景:数据返回100调可是为了前端显示效果默认只显示20条,其他数据由dataZoom控制显示隐藏: functio ...

  9. Struts2漏洞解决

    如果你也正在使用Struts2作为web层框架做开发或者做公司的送检产品,然后被告知有各种各样的Struts2漏洞,那本篇博客值得你花时间来喽上一两眼. 前端时间抽空为公司做了新一代的送检产品,为了方 ...

  10. u盘安装原版win10系统1703更新

    7月底,微软发布了win10的1703更新,听说值得一试,于是,安装ultraISO(下载地址http://pan.baidu.com/s/1dFu48d7 密码: 53cg),下载win10的ISO ...