1. 1文件上传技术:

JSPSmartUpload:应用在Model1年代.(嵌入到JSP)

FileUpload:应用在Model2年代.

Servlet3.o:完成文件上传.

Struts2框架:完成文件上传.

1.2    文件上传要素:

* 1.表单的提交方式:POST.(POST 没有大小限制)

* 2.表单元素中需要有<input type=”file”>这个元素必须有一个name属性.

* 3.表单的enctype属性是multipart/form-data(MIME协议中的分部分.)

1.3   Struts2完成文件上传:

页面:

文件上传:<input type="file" name="upload"><br/>

  1. <s:form theme="simple" action="templateAction_%{ id == null? 'add' : 'edit' }" namespace="/" method="post" enctype="multipart/form-data">

Action:

提供三个属性:

private File upload; // 获得文件

private String uploadContentType; // 获得文件类型

private String uploadFileName; // 获得文件名

对三个属性提供set方法:

2.1  文件下载原理:

将服务器上一个文件输出到浏览器:

* 设置两个头和一个流.

* ContentType:文件的MIME类型.

* Content-Dispostion:提示下载.

* 代表文件的输入流:---(输出流是固定的response.getOutputStream();)

2.2    Struts2中的文件下载:

  1. 依赖一个stream的结果类型:
  2. Action中提供:
  3. // 获得文件的MIME类型的方法:
  4. // 相当于Action类中有contentType属性.
  5. public String getContentType() {
  6. // 如何获得文件的MIME类型?
  7. String type = ServletActionContext.getServletContext().getMimeType(
  8. filename);
  9. return type;
  10. }
  11.  
  12. // 提供一个流
  13. public InputStream getInputStream() throws FileNotFoundException {
  14. // web 项目:
  15. // 获得download的磁盘绝对路径
  16. String realpath = ServletActionContext.getServletContext().getRealPath(
  17. "/download");
  18. InputStream is = new FileInputStream(realpath + "/" + filename);
  19. return is;
  20. }
  21.  
  22. // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
  23. // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
  24. public String getFileName() throws IOException {
  25. // 获得浏览器类型:
  26. String agent = ServletActionContext.getRequest()
  27. .getHeader("User-Agent");
  28. // 调用该方法进行编码
  29. String name = encodeDownloadFilename(filename, agent);
  30. return name;
  31. }
  32.  
  33. /**
  34. * 下载文件时,针对不同浏览器,进行附件名的编码
  35. *
  36. * @param filename
  37. * 下载文件名
  38. * @param agent
  39. * 客户端浏览器
  40. * @return 编码后的下载附件名
  41. * @throws IOException
  42. */
  43. public String encodeDownloadFilename(String filename, String agent)
  44. throws IOException {
  45. if (agent.contains("Firefox")) { // 火狐浏览器
  46. filename = "=?UTF-8?B?"
  47. + new BASE64Encoder().encode(filename.getBytes("utf-8"))
  48. + "?=";
  49. } else { // IE及其他浏览器
  50. filename = URLEncoder.encode(filename, "utf-8");
  51. }
  52. return filename;
  53. }
  54.  
  55. 在配置文件中:
  56. <!-- 配置文件下载的Action -->
  57. <package name="download" extends="struts-default">
  58. <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
  59. <!-- 完成下载 需要在resulttype属性上使用stream -->
  60. <result name="success" type="stream">
  61. <!-- 参数的namestream结果类型中的参数的名称 -->
  62. <!-- OGNL表达式:获得到ActioncontentType的属性! -->
  63. <param name="contentType">${contentType}</param>
  64. <!-- 设置ContentDispostion -->
  65. <param name="contentDisposition">attachment;filename=${fileName}</param>
  66. <!-- <param name="inputName">${stream}</param> -->
  67. </result>
  68. </action>
  69. </package>
  70. 依赖一个stream的结果类型:
  71. Action中提供:
  72. // 获得文件的MIME类型的方法:
  73. // 相当于Action类中有contentType属性.
  74. public String getContentType() {
  75. // 如何获得文件的MIME类型?
  76. String type = ServletActionContext.getServletContext().getMimeType(
  77. filename);
  78. return type;
  79. }
  80.  
  81. // 提供一个流
  82. public InputStream getInputStream() throws FileNotFoundException {
  83. // web 项目:
  84. // 获得download的磁盘绝对路径
  85. String realpath = ServletActionContext.getServletContext().getRealPath(
  86. "/download");
  87. InputStream is = new FileInputStream(realpath + "/" + filename);
  88. return is;
  89. }
  90.  
  91. // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
  92. // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
  93. public String getFileName() throws IOException {
  94. // 获得浏览器类型:
  95. String agent = ServletActionContext.getRequest()
  96. .getHeader("User-Agent");
  97. // 调用该方法进行编码
  98. String name = encodeDownloadFilename(filename, agent);
  99. return name;
  100. }
  101.  
  102. /**
  103. * 下载文件时,针对不同浏览器,进行附件名的编码
  104. *
  105. * @param filename
  106. * 下载文件名
  107. * @param agent
  108. * 客户端浏览器
  109. * @return 编码后的下载附件名
  110. * @throws IOException
  111. */
  112. public String encodeDownloadFilename(String filename, String agent)
  113. throws IOException {
  114. if (agent.contains("Firefox")) { // 火狐浏览器
  115. filename = "=?UTF-8?B?"
  116. + new BASE64Encoder().encode(filename.getBytes("utf-8"))
  117. + "?=";
  118. } else { // IE及其他浏览器
  119. filename = URLEncoder.encode(filename, "utf-8");
  120. }
  121. return filename;
  122. }
  123.  
  124. 在配置文件中:
  125. <!-- 配置文件下载的Action -->
  126. <package name="download" extends="struts-default">
  127. <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
  128. <!-- 完成下载 需要在resulttype属性上使用stream -->
  129. <result name="success" type="stream">
  130. <!-- 参数的namestream结果类型中的参数的名称 -->
  131. <!-- OGNL表达式:获得到ActioncontentType的属性! -->
  132. <param name="contentType">${contentType}</param>
  133. <!-- 设置ContentDispostion -->
  134. <param name="contentDisposition">attachment;filename=${fileName}</param>
  135. <!-- <param name="inputName">${stream}</param> -->
  136. </result>
  137. </action>
  138. </package>

关于struts2的上传和下载的更多相关文章

  1. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

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

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

  3. 【SSH2(实用文章)】--Struts2文件上传和下载的例子

    回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...

  4. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  5. struts2 文件上传和下载,以及部分源代码解析

    struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...

  6. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  7. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  8. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

  9. struts2文件上传和下载

    1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截 ...

随机推荐

  1. SQL Server 2005如何远程连接数据库?

    SQL Server 2005如何远程连接数据库? 方法/步骤   1 在配置工具中的服务和远程连接的外围应用配置器 --->远程连接-->本地连接和远程连接-->同时使用TCP/I ...

  2. js中的new关键字都干了些什么?

    new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在javascript中,我们将这类方式成为Pseudoclassic ...

  3. Obective-C之宏定义

    优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令. 什么动画时长啊,cell高度啊,cell的个 ...

  4. 【转】SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

  5. JSON.parse: expected property name or '}'

    早上被这问题坑了一个小时有了.后台返回的json如下,一切正常,但是手动把下面的json复制到js代码中,一直提示“ JSON.parse: expected property name or '}' ...

  6. bzoj3261 可持久化trie

    容易想到题解. 总结一下区间异或和题: 1.转化成trie 2.注意空间稍微开大 3.不要一个数右移31位 4.考虑开头要不要插一个零 5.注意可持久get的时候区间是左开右闭,但这样会变成x-2,x ...

  7. Linux安装JDK详细步骤

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...

  8. UIPickerView用法(左右比例,整体大小,字体大小)

    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero]; pickerView.autoresizingM ...

  9. ThinkPHP CURD方法盘点:data方法

    data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法. 用法 写操作 通常情况下我们都是通过create方法或者赋值 ...

  10. Android手机监控软件设计实现

    一.需求分析: 随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台. 手机监控软件则是基于电脑监控软件的原理,植入手机平 ...