上传文件在一个系统当中是一个很常用的功能,也是一个比较重要的功能。今天我们就一起来学习一下Struts2如何上传文件。

今天讲的上传文件的方式有三种:

1,以字节为单位传输文件;

2,Struts2封装的一种方式;

3,以字符的方式传输文件。

其实这三种方式都差不
多,都是将文件先从客户端一临时文件的形式,传输到服务器的临时文件夹下,然后在将该临时文件复制到我们要上传的目录。另外,有一个需要注意,就是上传过
程中产生的这些临时文件,Struts2不会自动清理,所以我们需要手动清理临时文件,这一个下面的代码中有提到。

用Action来完成我们上传的核心功能:

  1. package com.action;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileOutputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.OutputStreamWriter;
  9. import java.util.Map;
  10. import org.apache.struts2.ServletActionContext;
  11. import com.opensymphony.xwork2.ActionContext;
  12. import com.opensymphony.xwork2.ActionSupport;
  13. public class UploadAction extends ActionSupport {
  14. private File upload;
  15. private String uploadFileName;
  16. private String uploadContentType;
  17. private long maximumSize;
  18. private String allowedTypes;
  19. public File getUpload() {
  20. return upload;
  21. }
  22. public void setUpload(File upload) {
  23. this.upload = upload;
  24. }
  25. public String getUploadFileName() {
  26. return uploadFileName;
  27. }
  28. public void setUploadFileName(String uploadFileName) {
  29. this.uploadFileName = uploadFileName;
  30. }
  31. public String getUploadContentType() {
  32. return uploadContentType;
  33. }
  34. public void setUploadContentType(String uploadContentType) {
  35. this.uploadContentType = uploadContentType;
  36. }
  37. public long getMaximumSize() {
  38. return maximumSize;
  39. }
  40. public void setMaximumSize(long maximumSize) {
  41. this.maximumSize = maximumSize;
  42. }
  43. public String getAllowedTypes() {
  44. return allowedTypes;
  45. }
  46. public void setAllowedTypes(String allowedTypes) {
  47. this.allowedTypes = allowedTypes;
  48. }
  49. @Override
  50. public String execute() throws Exception {
  51. File uploadFile = new File(ServletActionContext.getServletContext().getRealPath("upload"));
  52. if(!uploadFile.exists()) {
  53. uploadFile.mkdir();
  54. }
  55. //验证文件大小及格式
  56. if (maximumSize < upload.length()) {
  57. return "error";
  58. }
  59. boolean flag =false;
  60. String[]  allowedTypesStr = allowedTypes.split(",");
  61. for (int i = 0; i < allowedTypesStr.length; i++) {
  62. if (uploadContentType.equals(allowedTypesStr[i])) {
  63. flag = true;
  64. }
  65. }
  66. if (flag == false) {
  67. Map request = (Map) ActionContext.getContext().get("request");
  68. request.put("errorMassage", "文件类型不合法!");
  69. System.out.println(request.toString());
  70. return "error";
  71. }
  72. //第一种上传方式
  73. //      FileInputStream input = new FileInputStream(upload);
  74. //      FileOutputStream out = new FileOutputStream(uploadFile +"//"+ uploadFileName);
  75. //      try {
  76. //          byte[] b =new byte[1024];
  77. //          int i = 0;
  78. //          while ((i=input.read(b))>0) {
  79. //              out.write(b, 0, i);
  80. //          }
  81. //      } catch (Exception e) {
  82. //          e.printStackTrace();
  83. //      } finally {
  84. //          //关闭输入、输出流
  85. //          input.close();
  86. //          out.close();
  87. //          //删除临时文件
  88. //          upload.delete();
  89. //      }
  90. //第二种上传方式
  91. //      FileUtils.copyFile(upload, new File(uploadFile+"\\"+uploadFileName));
  92. //      //删除临时文件
  93. //      upload.delete();
  94. //第三种上传方式
  95. BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(upload)));
  96. BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile+"\\"+ uploadFileName)));
  97. try {
  98. char [] c =new char[1024];
  99. int i = 0;
  100. while ((i = bReader.read(c)) > 0) {
  101. bWriter.write(c, 0, i);
  102. }
  103. } catch (Exception e) {
  104. e.printStackTrace();
  105. } finally {
  106. bReader.close();
  107. bWriter.close();
  108. //删除临时文件
  109. upload.delete();
  110. }
  111. return "success";
  112. }
  113. }

在Struts.xml文件中配置我们的Action:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.action.extension" value=","></constant>
  7. <!-- 上传文件最大限制(如果为多文件上传,则为多个文件的总大小) -->
  8. <constant name="struts.multipart.maxSize" value="40000000"></constant>
  9. <!-- 存放上传文件的临时目录 -->
  10. <constant name="struts.multipart.saveDir" value="D:\\temp"></constant>
  11. <package name="upload" namespace="/file" extends="struts-default">
  12. <action name="upLoad" class="com.action.UploadAction">
  13. <result name="success">/success.jsp</result>
  14. <result name="error" >/error.jsp</result>
  15. <result name = "input" type ="redirect">/index.jsp</result>
  16. <param name="maximumSize ">1000000</param>
  17. <param name="allowedTypes">application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain</param>
  18. <!--用struts拦截器限制上传文件大小及类型
  19. <interceptor-ref name="fileUpload">
  20. 单个文件的大小
  21. <param name="maximumSize ">1000000</param>
  22. <param name="allowedTypes">application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,text/plain</param>
  23. </interceptor-ref>
  24. <interceptor-ref name="defaultStack"></interceptor-ref>
  25. -->
  26. </action>
  27. </package>
  28. </struts>

文件上传的页面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>上传文件</title>
  8. </head>
  9. <body>
  10. <!-- enctype="multipart/form-data"不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 -->
  11. <form action="file/upLoad" method="post" enctype="multipart/form-data">
  12. <input name="upload" type="file">
  13. <input name="btnUpload" type="submit" value="上传">
  14. </form>
  15. </body>
  16. </html>

上传文件之前,通常要判断一下文件的大小及类型,上面有两种方式来验证,一种是在Action里验证,一种是通过Struts2的拦截器验证。两者选其一,选择一个把另一个注释掉即可。

另外,还有一个需要注意:上传文件页面中form的enctype属性值,一定要设置成"multipart/form-data",否则就会出错。

struts——文件上传的更多相关文章

  1. struts文件上传,获取文件名和文件类型

    struts文件上传,获取文件名和文件类型   Action中还有两个属 性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名.文件类型.这是S ...

  2. struts文件上传(多文件)

    第01步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  3. struts文件上传、文件下载

    文件上传 如果在表单中上传文件,表单的enctype属性为multipart/form-data struts默认上传文件大小为2M,如果需要修改,在配置文件中设置 <constant name ...

  4. Struts文件上传allowedTypes问题,烦人的“允许上传的文件类型”

    Struts的文件上传问题,相信很多人都会使用allowedTypes参数来配置允许上传的文件类型,如下. <param name="allowedTypes"> im ...

  5. struts文件上传(单文件)

    第01步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  6. Struts文件上传机制

    1首先建立文件上传jsp页面如下 <form action="" method="post" enctype="multipart/form-d ...

  7. struts 文件上传下载

    上传 1.编写上传action类 UploadAction.java package jxf.b_upload; import java.io.File; import java.io.IOExcep ...

  8. struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  9. Java Struts文件上传和下载详解

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

随机推荐

  1. 与Jquery Mobile的第一次亲密接触

    Jquery Mobile闻名已久,今天终于有亲密接触的机会. 通过动手写的demo,对它有了一个基本的认识: 自带的UI组件用起来简洁,方便:对旧版本的浏览器或移动设备能做到很好的优雅降级,而不影响 ...

  2. 由mysql数据库基础上的php程序实现单词的查询、删除、更改和查询

    我做了一个php程序,将表单数据添加到数据库,借用mysql扩展库函数实现对mysql数据库的操作,能够实现添加单词.删除单词.更新和查询单词.运行环境是普通的mysql数据库和php.Apache服 ...

  3. DOS命令大全--具体解释

    在Linux和Windows下都能够用nslookup命令来查询域名的解析结果 DOS命令大全一)MD--建立子文件夹 1.功能:创建新的子文件夹 2.类型:内部命令 3.格式:MD[盘符:][路径名 ...

  4. [置顶] IOS7状态栏StatusBar官方标准适配方法

    IOS7状态栏StatusBar官方标准适配方法 hello,大家好,ios7正式版已经发布,相信大家都在以各种方式来适配ios7. 如果你已经下载了xcode5,正准备使用,你会发现各种布局的改变. ...

  5. maven 打包源文件

    1.The source plugin can be used to create a jar file of the project sources from the command line or ...

  6. [RxJS] Starting a Stream with SwitchMap & switchMapTo

    From an event map to another event we can use switchMap(), switchMap() accept an function which retu ...

  7. Nginx Configure时配置

    Configure Arguments Configure arguments common for nginx binaries from pre-built packages for stable ...

  8. AngularJs练习Demo1

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  9. java 静态文件使用注解

    spring框架为我们代码的编写带来了极大的便利,特别是注解的使用.但是有个问题,当我们在静态文件中使用注解的时候,这个时候就会报错了.如以下代码: @Autowired private UserSe ...

  10. iOS在MRC工程环境下下使用ARC的方法