4、struts2 文件上传下载

1、文件上传

struts提交的文件组件上传,

前台:

1、提交方式POST

2、表单类型 multipart/form-data

3、input type=file

后台:

Apache提供的FileUpload组件

核心类:

FileItemFactory FileItem的工厂

ServletFileUpload servlet 中的文件上传的核心类

FileItem 封装了上传的表单文件项的信息

总之 文件上传,处理起来比较麻烦

Struts的文件上传

文件上传拦截器帮助我们晚场了文件上传的功能

       <interceptor
           name="fileUpload"
 class="org.apache.structs2.interceptor.FileUploadInterceptor"/> 

upload.xml

<struts>

    <package name="upload_" extends="struts-default">
        <!-- 注意: action 的名称不能用关键字"fileUpload" -->
        <action name="fileUploadAction" class="cn.itcast.e_fileupload.FileUpload">

            <!-- 限制运行上传的文件的类型 -->
            <interceptor-ref name="defaultStack">

                <!-- 限制运行的文件的扩展名 -->
                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>

                <!-- 限制运行的类型   【与上面同时使用,取交集】
                <param name="fileUpload.allowedTypes">text/plain</param>
                -->

            </interceptor-ref>

            <result name="success">/e/success.jsp</result>

            <!-- 配置错误视图 -->
            <result name="input">/e/error.jsp</result>
        </action>
    </package>
</struts>

upload.jsp

<body>
    <form action="${pageContext.request.contextPath }/fileUploadAction" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="userName"><br/>
        文件:<input type="file" name="file1"><br/>

        <input type="submit" value="上传">
    </form>
  </body>

error.jsp

 <body>
    error.jsp<br/>
    <!-- 查看struts框架在运行时期产生的所有错误信息 -->
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <s:fielderror></s:fielderror>
  </body>
success.jsp
<body>
    success.jsp
  </body>

核心代码

FileUpload .class

public class FileUpload extends ActionSupport {

    // 对应表单:<input type="file" name="file1">
    private File file1;
    // 文件名
    private String file1FileName;
    // 文件的类型(MIME)
    private String file1ContentType;
    public void setFile1(File file1) {
        this.file1 = file1;
    }
    public void setFile1FileName(String file1FileName) {
        this.file1FileName = file1FileName;
    }
    public void setFile1ContentType(String file1ContentType) {
        this.file1ContentType = file1ContentType;
    }

    @Override
    public String execute() throws Exception {
        /******拿到上传的文件,进行处理******/
        // 把文件上传到upload目录

        // 获取上传的目录路径
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        // 创建目标文件对象
        File destFile = new File(path,file1FileName);
        // 把上传的文件,拷贝到目标文件中
        FileUtils.copyFile(file1, destFile);

        return SUCCESS;
    }
}

文件上传处理细节

文件大小限制

structs默认支持的文件上传最大是2M,通过常量修改:

    <!-- 4. 修改上传文件的最大大小为30M -->
    <constant name="struts.multipart.maxSize" value="31457280"/>

限制上传文件的允许类型

需求:只允许txt/jpg后缀的文件

拦截器:注入参数从而限制文件上传类型

  <!-- 限制运行上传的文件的类型 -->
            <interceptor-ref name="defaultStack">

                <!-- 限制运行的文件的扩展名 -->
                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>

                <!-- 限制运行的类型   【与上面同时使用,取交集】
                <param name="fileUpload.allowedTypes">text/plain</param>
                -->

            </interceptor-ref>

2、文件的下载

struts文件下载,2种方式:

方式1:通过response对象向浏览器写入字节流数据;设置下载的响应头

方式2:struts的方式

struts的文件下载:

   <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

首先注意在webroot目录下新建 upload 文件夹,把你要提供下载的文件放到该文件夹下,

upload.xml

<action name="down_*" class="cn.itcast.e_fileupload.DownAction" method="{1}">
            <!-- 列表展示 -->
            <result name="list">/e/list.jsp</result>
            <!-- 下载操作 -->
            <result name="download" type="stream">

                <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 -->
               <param name="contentType">application/octet-stream</param>

               <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 -->
               <param name="inputName">attrInputStream</param>

               <!-- 下载头,包括:浏览器显示的文件名 -->
               <param name="contentDisposition">attachment;filename=${downFileName}</param>

                <!-- 缓冲区大小设置 -->
               <param name="bufferSize">1024</param>
            </result>
        </action>

list.jsp

<body>
    <table border="1" align="center">
        <tr>
            <td>编号</td>
            <td>文件名</td>
            <td>操作</td>
        </tr>
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <c:forEach var="fileName" items="${fileNames}" varStatus="vs">
            <tr>
                <td>${vs.count }</td>
                <td>${fileName }</td>
                <td>
                    <!-- 构建一个url -->
                    <c:url var="url" value="down_down">
                        <c:param name="fileName" value="${fileName}"></c:param>
                    </c:url>

                    <a href="${url }">下载</a>
                </td>
            </tr>
        </c:forEach>
    </table>
  </body>

DownAction

/**
 * 文件下载
 * 1. 显示所有要下载文件的列表
 * 2. 文件下载
 *
 */
public class DownAction extends ActionSupport {

    /*************1. 显示所有要下载文件的列表*********************/
    public String list() throws Exception {

        //得到upload目录路径
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        // 目录对象
        File file  = new File(path);
        // 得到所有要下载的文件的文件名
        String[] fileNames =  file.list();
        // 保存
        ActionContext ac = ActionContext.getContext();
        // 得到代表request的map (第二种方式)
        Map<String,Object> request= (Map<String, Object>) ac.get("request");
        request.put("fileNames", fileNames);
        return "list";
    }

    /*************2. 文件下载*********************/

    // 1. 获取要下载的文件的文件名
    private String fileName;
    public void setFileName(String fileName) {
        // 处理传入的参数中问题(get提交)
        try {
            fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        // 把处理好的文件名,赋值
        this.fileName = fileName;
    }

    //2. 下载提交的业务方法 (在struts.xml中配置返回stream)
    public String down() throws Exception {
        return "download";
    }

    // 3. 返回文件流的方法
    public InputStream getAttrInputStream(){
        return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
    }

    // 4. 下载显示的文件名(浏览器显示的文件名)
    public String getDownFileName() {
        // 需要进行中文编码
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }

}
时间: 2024-11-10 07:38:01

4、struts2 文件上传下载的相关文章

【SSH2(实践篇)】--Struts2文件上传下载实例

上篇文章又一次回顾了Struts2的运行机制,对它的运行步骤做了一步步的解析,这个解析不但再一次理清了Struts2的使用方法,而且对它的映射机制进行了深入的解析,并在最后通过一个实例来介绍了Struts2的一种使用方法,这里将做一个有关文件上传下载的实例. 一.文件上传 Struts2并没有提供文件上传的组件,所以想要实现上传的功能就必须通过第三方组件来实现,在Struts2引用的jar中包含了文件上传的组件,它是通过commons-fileupload.jar和commons-io.jar来

struts2 文件上传下载

四.文件的上传(拦截器)和下载(stream结果类型)(需要练一遍) 1.文件上传 必要前提: a.表单method必须是post: b.enctype取值必须是multipart/form-data: c.提供文件选择域. 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-t

struts2文件上传下载

文件上传 1.struts2中文件上传介绍 struts2文件上传需要使用apache提供的文件上传组件(commons-fileupload.jar和commons-io.jar). struts2文件上传的核心是通过fileupload拦截器实现的. 2.如何实现文件上传 1>.添加commons-fileupload和commons-io包 2>.在jsp页面做如下配置 将form的method属性值设置为post 给form标记添加属性enctype="multipart/f

Struts2 文件上传,下载,删除

本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用FileUtil上传 6.使用IOUtil上传 7.使用IOUtil上传 8.使用数组上传多个文件 9.使用List上传多个文件 ----1.基于表单的文件上传----- fileupload.jsp <body> <form action="showFile.jsp" na

Struts2学习之文件上传/下载&amp;ValueStack(三)

简介 今天是学习Struts2第三天,也算struts2准备前奏告一段落,提升部分只能在后期深入了解,多看源码,多参阅资料.今天所学的知识点文件上传.下载/ValueStack&OGNL/Struts2标签 文件上传/下载 文件上传简介 a). 企业常用文件上传技术 : jspSmartUpload(主要应用 JSP model1 时代) . fileupload (Apache commons项目中一个组件). Servlet3.0 集成文件上传 Part类 b). Struts2 对文件上传

Struts2之文件上传下载

本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 1 <!-- 引入struts标签 --> 2 <%@taglib prefix="s" uri="/struts-tags"%> 3 4 <!-- 5 使用struts中的<s:file></s:file>标签来选择文件. 6 设置name属性,则提交后将传递后给后台一个name属性

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

一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现: com.cy.action.FileUploadAction.java: package com.cy.action; import java.io.File; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork

ssh框架文件上传下载

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Author" content="BuNuo"> <meta name="Keywords" content="文件上传下载"> <meta name="

文件上传(多文件上传)/下载

通常我们会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就文件下载和多文件上传的源代码进行一下讲 文件上传 首先先创建jsp页面(用于多文件上传) <%@ page language="java" import="java.util.