关于Struts2的文件下载

首先先来说下关于文件下载的原理:

服务端为客户端提供了一个下载服务,所以服务端需要一个输出流(把客户请求下载的文件输出),相对于服务端来说,客户端需要下载接收一个文件,所以它需要一个输入流(接收文件)。

服务器读取要下载文件的内容,用一个Response响应流写回并设置HTTP头信息ContentType(文件类型)、 ContentDisposition(以什么方式打开)

下面给出一个小Demo,具体代码具体分析吧

 

1、首先是提供下载的页面:download.jsp

给出超链接到Action并用Get方式传递一个文件名进行属性注入

 1 <%@ page language="java contentTypetext/html; charset=utf-8 pageEncodingutf-8"%>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 3 <html 4 head 5 meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" 6 title>下载文件示例</ 7  8 body 9 h2>下载文件10 a href="download.action?filename=照片文件.jpg">点击下载照片文件a11 ="download.action?filename=admin.rar">点击下载压缩包文件12 ="download.action?filename=总结.txt">点击下载文本文件13 14 >

 

2、处理下载文件的Action:DowloadAction.java

这里提供了一个成员变量属性来接收页面传递过来的文件名,由于文件名是以Get方式传递过来的,中文会出现乱码问题,所以在setter方法里需要做一些处理,也就是重新编码。

 1 package com.lcw.struts2.dowload;
 2 
import java.io.File;
 java.io.FileInputStream;
 java.io.FileNotFoundException;
 java.io.IOException;
 java.io.InputStream;
 java.io.UnsupportedEncodingException;
 java.net.URLEncoder;
10 
 org.apache.struts2.ServletActionContext;
12 
 sun.misc.BASE64Encoder;
14 
15  com.opensymphony.xwork2.ActionSupport;
16 /**
17  * 对于客户端来说它需要下载接收一个文件,也就是说它需要一个输入流
18  * 对于服务端来说它需要对外提供一个下载的服务,也就是说它需要一个输出流
19  */
20 
21 public class DowloadAction extends ActionSupport {
22 
23     private String filename;//下载页面传递了该参数,需提供setter方法接收
24 
25     void setFilename(String filename) {
26         由于是get方式传递的,中文会出现乱码,不能直接获取,需转码
27         try {
28             this.filename = new String(filename.getBytes("ISO-8859-1"),"utf-8");
29         } catch (UnsupportedEncodingException e) {
30             e.printStackTrace();
31         }
32     }
33     
34     public String execute(){
35         System.out.println("正在下载文件:"+filename);
36         return SUCCESS;
37 38     
39     为客户端提供输入流
40     public InputStream getInputStream() throws FileNotFoundException{
41         String srcFile=ServletActionContext.getServletContext().getRealPath("/download")+"/"+filename;
42         File file=new File(srcFile);得到一个file对象
43         return new FileInputStream(file);返回一个文件输入流
44 45     
46     根据不同的文件动态给出MIME文件类型
47      String getContentType(){
48         在Tomcat Conf里的web.xml有对应的映射文件
49          ServletActionContext.getServletContext().getMimeType(filename);
50 51     
52     返回一个文件名
53     public String getFilename()  IOException{
54         String agent=ServletActionContext.getRequest().getHeader("user-agent");根据http头信息获取对应的浏览器类型
55          encodeDownloadFilename(filename,agent);
56 57     
58     
59     下载附件名乱码问题 , IE和火狐 解决不同   IE默认是Url编码 火狐默认是base64编码
60      String encodeDownloadFilename(String filename,String agent)
61              IOException {
62         if (agent.contains("Firefox")) {  火狐浏览器
63             filename = "=?UTF-8?B?"
64                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))
65                     + "?=";
66         } else {  IE及其他浏览器
67             filename = URLEncoder.encode(filename,1)">68 69          filename;
70 71 }

看了上面的代码,如果不清楚这块知识点的朋友可能会有点蒙,别急,下面我来解析下这段代码是怎么来的

首先Struts2的文件下载是通过一个结果集stream来完成的,在Struts2核心包里的struts-default.xml里我们可以找到这样的一句话:

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

我们来看下这个类(org.apache.struts2.dispatcher.StreamResult)里面有什么,Ctrl+Shift+T关联下源代码

这个类里面给出了很多参数,因为都有默认值,所以我们不需要全部到去改动它,只需要改变我们需要的地方就可以了。

这里来解释下上面画红色框的参数内容:contentType,contentDisposition,inputName

contetType:是下载文件对应的MIME协议类型,比如:text/html,text/plain等,这个参数我们不能写死,因为我们的下载文件的类型有很多,有时是图片,有时是文档等。

contentDisposition:是下载文件的打开方式,这里默认是inline也就是内联在浏览器打开,如果不想关联浏览器我们可以把它设置成attment以附件的形式打开。

inputNmae:这是定义一个返回流(客户端需要的输入流)的名称,属性值为inputStream。

 

所以我们需要在Action里面提供这些东西,利用JAVA的反射机制让Struts2的配置文件(压入值栈,并给出getter方法)读取到就行了。

这里我们的下载附件名依旧会乱码,因为IE等浏览器默认的编码是URL而火狐浏览器默认的编码是BASE64,我们需要在这里判断客户端使用的是什么浏览器,这个很简单,只需要得到客户端的HTTP头信息Agment就行了,具体代码在上面encodeDownloadFilename方法里以给出,拿来用便是了。

 

3、再来看下配置文件struts.xml的配置:

由于Action里已给出我们所需参数的getter方法,我们在这边这需要用Ognl表达式取出,就可以根据我们要下载的文件,动态给出所需参数了,没有设置的参数就意味着保持默认值。

<?xml version="1.0" encoding="UTF-8"?>
DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd"struts 6     constant ="struts.devMode" value="true" />
 7     
 8     <!-- 全局国际化配置 -->
 9     ="struts.custom.i18n.resources"="messages"></constant11     package ="struts2test" extends="struts-default"12         action ="download"="com.lcw.struts2.dowload.DowloadAction"13             result type="stream"14                  一个流二个头 15                  ognl表达式,动态给出不同下载文件相相对应的MIME协议规定的类型 比如:text/html16                  在Action里给出getContentType压栈 17                     param ="contentType">${contentType}param18                  下载文件打开方式 inline浏览器内部打开,attachment 以附件形式打开 19                  在Action里动态返回文件名 getFilename 20                     ="contentDisposition">attachment;filename=${filename}21             result22         action25 >

 

然后我们新建一个文件夹download,把要下载的文件和web页面提供的文件名一样放入

到这里就大功告成了,看下页面效果吧:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。 对于异常的处理,一般分为两种方式: 编程式异常处理:是指在代
说明:使用注解方式实现AOP切面。 什么是AOP? 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。 AOP底层使用动态代理。 AOP术语 连接点
Spring MVC中的拦截器是一种可以在请求处理过程中对请求进行拦截和处理的机制。 拦截器可以用于执行一些公共的操作,例如日志记录、权限验证、数据转换等。在Spring MVC中,可以通过实现HandlerInterceptor接口来创建自定义的拦截器,并通过配置来指定拦截器的应用范围和顺序。 S
在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。常见的共享域有四种:ServletContext、HttpSession、HttpServletRequest、PageContext。 ServletContext 共享域:
文件上传 说明: 使用maven构建web工程。 使用Thymeleaf技术进行服务器页面渲染。 使用ResponseEntity实现下载文件的功能。 @Controller public class FileDownloadAndUpload { @GetMapping(&quot;/file/d
创建初始化类,替换web.xml 在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringS
在 Web 应用的三层架构中,确保在表述层(Presentation Layer)对数据进行检查和校验是非常重要的。正确的数据校验可以确保业务逻辑层(Business Logic Layer)基于有效和合法的数据进行处理,同时将错误的数据隔离在业务逻辑层之外。这有助于提高系统的健壮性、安全性和可维护
什么是事务? 事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败 。 事务四个特性(ACID) 原子性 一组操作要么都成功,要么都失败。 一致性 一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。 隔离性 事
什么是JdbcTemplate? Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。 准备工作 引入jdbcTemplate的相关依赖: 案例实操 创建jdbc.properties文件,配置数据库信息 jdbc.driver=com.mysql.cj.
SpringMVC1.MVC架构MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范是将业务逻辑、数据、显示分离的方法来写代码MVC主要作用是:降低了视图和业务逻辑之间的双向耦合MVC是一个架构模型,不是一种设计模式。1.model(模型)数据模型,提供要展示的数据,因此包
SpringMVC学习笔记1.SpringMVC应用1.1SpringMVC简介​SpringMVC全名叫SpringWebMVC,是⼀种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。​MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(co
11.1数据回显基本用法数据回显就是当用户数据提交失败时,自动填充好已经输入的数据。一般来说,如果使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果是通过表单做数据提交,那么数据回显就非常有必要了。11.1.1简单数据类型简单数据类型,实际上框架在这里没有
一、SpringMVC简介1、SpringMVC中重要组件DispatcherServlet:前端控制器,接收所有请求(如果配置/不包含jsp)HandlerMapping:解析请求格式的.判断希望要执行哪个具体的方法.HandlerAdapter:负责调用具体的方法.ViewResovler:视图解析器.解析结果,准备跳转到具体的物
1.它们主要负责的模块Spring主要应用于业务逻辑层。SpringMVC主要应用于表现层。MyBatis主要应用于持久层。2.它们的核心Spring有三大核心,分别是IOC(控制反转),DI(依赖注入)和AOP(面向切面编程)。SpringMVC的核心是DispatcherServlet(前端控制器)。MyBatis的核心是ORM(对
3.注解开发Springmvc1.使用注解开发要注意开启注解支持,2.注解简化了,处理映射器和处理适配器,只用去管视图解析器即可案例代码:1.web.xml,基本不变可以直接拿去用<!--调用DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name>
拦截器概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。过滤器servlet规范中的一部分,任何javaweb工程都可以使用
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="
学习内容:1、SSH&SSM2、Spring3、Struts2&SpringMVC4、Hibernate&MyBatis学习产出:1.SSH和SSM都是有Spring框架的,他们两个差不多。2.Spring分为四个模块,持久层,表示层,检测层,还有核心层,核心层分为2个关键核心功能。分别为,控制反转(IOC),依赖注入(DI),和面向切面编程
一、SpringMVC项目无法引入js,css的问题具体原因是css和js等被SpringMVC拦截了:解决方案:在spring-mvc.xml中配置<mvc:default-servlet-handler/><?xmlversion="1.0"encoding="UTF-8"?><beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
开发环境:Eclipse/MyEclipse、Tomcat8、Jdk1.8数据库:MySQL前端:JavaScript、jQuery、bootstrap4、particles.js后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页适用于:课程设计,毕业设计,学习等等系统介绍