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/>

 <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中的文件下载:

 依赖一个stream的结果类型:
 在Action中提供:
 // 获得文件的MIME类型的方法:
     // 相当于Action类中有contentType属性.
     public String getContentType() {
         // 如何获得文件的MIME类型?
         String type = ServletActionContext.getServletContext().getMimeType(
                 filename);
         return type;
     }

     // 提供一个流
     public InputStream getInputStream() throws FileNotFoundException {
         // web 项目:
         // 获得download的磁盘绝对路径
         String realpath = ServletActionContext.getServletContext().getRealPath(
                 "/download");
         InputStream is = new FileInputStream(realpath + "/" + filename);
         return is;
     }

     // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
     // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
     public String getFileName() throws IOException {
         // 获得浏览器类型:
         String agent = ServletActionContext.getRequest()
                 .getHeader("User-Agent");
         // 调用该方法进行编码
         String name = encodeDownloadFilename(filename, agent);
         return name;
     }

     /**
      * 下载文件时,针对不同浏览器,进行附件名的编码
      *
      * @param filename
      *            下载文件名
      * @param agent
      *            客户端浏览器
      * @return 编码后的下载附件名
      * @throws IOException
      */
     public String encodeDownloadFilename(String filename, String agent)
             throws IOException {
         if (agent.contains("Firefox")) { // 火狐浏览器
             filename = "=?UTF-8?B?"
                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                     + "?=";
         } else { // IE及其他浏览器
             filename = URLEncoder.encode(filename, "utf-8");
         }
         return filename;
     }

 在配置文件中:
     <!-- 配置文件下载的Action -->
     <package name="download" extends="struts-default">
         <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
             <!-- 完成下载 需要在result的type属性上使用stream -->
             <result name="success" type="stream">
                 <!-- 参数的name是stream结果类型中的参数的名称 -->
                 <!-- OGNL表达式:获得到Action中contentType的属性! -->
                 <param name="contentType">${contentType}</param>
                 <!-- 设置ContentDispostion -->
                 <param name="contentDisposition">attachment;filename=${fileName}</param>
                 <!-- <param name="inputName">${stream}</param> -->
             </result>
         </action>
     </package>
 依赖一个stream的结果类型:
 在Action中提供:
 // 获得文件的MIME类型的方法:
     // 相当于Action类中有contentType属性.
     public String getContentType() {
         // 如何获得文件的MIME类型?
         String type = ServletActionContext.getServletContext().getMimeType(
                 filename);
         return type;
     }

     // 提供一个流
     public InputStream getInputStream() throws FileNotFoundException {
         // web 项目:
         // 获得download的磁盘绝对路径
         String realpath = ServletActionContext.getServletContext().getRealPath(
                 "/download");
         InputStream is = new FileInputStream(realpath + "/" + filename);
         return is;
     }

     // 文件的下载ContentDispostion中获得那个文件名:必须是编码后的文件名.
     // 中文:IE浏览器用URLEncoder Firefox:Base64编码.
     public String getFileName() throws IOException {
         // 获得浏览器类型:
         String agent = ServletActionContext.getRequest()
                 .getHeader("User-Agent");
         // 调用该方法进行编码
         String name = encodeDownloadFilename(filename, agent);
         return name;
     }

     /**
      * 下载文件时,针对不同浏览器,进行附件名的编码
      *
      * @param filename
      *            下载文件名
      * @param agent
      *            客户端浏览器
      * @return 编码后的下载附件名
      * @throws IOException
      */
     public String encodeDownloadFilename(String filename, String agent)
             throws IOException {
         if (agent.contains("Firefox")) { // 火狐浏览器
             filename = "=?UTF-8?B?"
                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                     + "?=";
         } else { // IE及其他浏览器
             filename = URLEncoder.encode(filename, "utf-8");
         }
         return filename;
     }

 在配置文件中:
     <!-- 配置文件下载的Action -->
     <package name="download" extends="struts-default">
         <action name="download" class="cn.itcast.struts2.demo2.DownloadAction">
             <!-- 完成下载 需要在result的type属性上使用stream -->
             <result name="success" type="stream">
                 <!-- 参数的name是stream结果类型中的参数的名称 -->
                 <!-- OGNL表达式:获得到Action中contentType的属性! -->
                 <param name="contentType">${contentType}</param>
                 <!-- 设置ContentDispostion -->
                 <param name="contentDisposition">attachment;filename=${fileName}</param>
                 <!-- <param name="inputName">${stream}</param> -->
             </result>
         </action>
     </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. hive内部表与外部表区别

    1.在Hive里面创建一个表: hive> create table wyp(id int,    > name string,    > age int,    > tele ...

  2. uvalive 3218 Find the Border

    题意:一条封闭折线将平面分成了若干个区域,按顺序给出折线各点的坐标,要求输出封闭折线的轮廓. 题解:用类似卷包裹的算法,先确定一个一定会被选中的点(x坐标最小,y坐标最小)作为起点,然后把可能是下一个 ...

  3. 软件开发中的单一职责(转至INFOQ)

    最近在实践微服务化过程中,对其“单一职责”原则深有体会.那么只有微服务化才可以单一职责,才可以解耦吗?答案是否定的. 单一职责原则是这样定义的:单一的功能,并且完全封装起来. 我们做后端Java开发的 ...

  4. [iOS基础控件 - 6.3] 使用可视化连线方式指定dataSource、delegate

    对着要指定dataSource或者delegate的控件右击,然后拖动线到指定的控制器上

  5. [C语言 - 1.2] 类型说明符、字符、数组

    A.类型说明符(只能修饰int) short int: = short 2字节 long int: long 8字节 = long   输出占位符 %ld signed int: = signed 默 ...

  6. [原创]Android秒杀倒计时自定义TextView

    自定义TextView控件TimeTextView代码: import android.content.Context; import android.content.res.TypedArray; ...

  7. 【转】Netty那点事(三)Channel中的Pipeline

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch3-pipeline.md Channel是理解和使用Nett ...

  8. jQuery生成二维条形码 jquery.qrcode.js

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. Process学习

    主要系统总结下我对进程的认识,以前理解得不够全面不够深入.本文肯定还不够好,当有新的认识新的理解后还会随时来更新.读完本文,下面几个问题便可理解清楚. 1.进程是什么? 2.为什么要有进程这个概念? ...

  10. 删除浏览器浏览器删除cookie方法

    上班之余抽点时光出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下删除浏览器 文章目录导航 适用范围及演示工具 什么是cookie? cookie有什么作用? ie6/ie7/ie8 ...