springMvc文件下载以及遇到的问题

官方源码 spring-framework-5.3.0.zip 官方源码 spring-framework-5.3.0.zip官方源码 spring-framework-5.3.0.zip 立即下载

最近开发需要用到一个下载功能,本人记性不好,脑主存估计只剩下索引了,无奈。

所以下载想用到spring封装好的,使用简单。于是copy到:

/**
     * 下载
     */
    @RequiresPermissions("pa:in:kpiData:view")
    @RequestMapping(value = { "/downloadAtt" })
    public ResponseEntity<byte[]> downloadAtt(Model model , HttpServletRequest request)throws Exception {
        HttpHeaders headers = new HttpHeaders();
        String url = request.getParameter("attUrl");
        int num = url.lastIndexOf("\\");
        String fileName = url.substring((num + 1), url.length());
        fileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");//为了解决一些浏览器的中文名称乱码问题
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", fileName);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(url)),
                headers, HttpStatus.CREATED);

    }
嗯……关键是最后三行,其余没有技术含量。

我这一看,吓一跳,因为以前给某市联通做过绩效,写过上传下载,因为是第n次开发所以代码风格很乱,我也就用了最传统的写法(我才不会告诉你当时太菜鸟,能写出功能就满意,没有甄别的实力)。当时至少还多一倍的代码行数。

spring果然牛,封装得很优雅,搞得我这种脑容量的人都觉得下载是如此简单。然后不禁看了部分源码(推荐直接看试验结果):

public class HttpHeaders implements MultiValueMap<String, String>, Serializable {
    private static final long serialVersionUID = -8578554704772377436L;
    public static final String ACCEPT = "Accept";
    public static final String ACCEPT_CHARSET = "Accept-Charset";
    public static final String ACCEPT_ENCODING = "Accept-Encoding";
    public static final String ACCEPT_LANGUAGE = "Accept-Language";
    public static final String ACCEPT_RANGES = "Accept-Ranges";
    public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
    public static final String ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers";
    public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
    public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
    public static final String ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers";
    public static final String ACCESS_CONTROL_MAX_AGE = "Access-Control-Max-Age";
    public static final String ACCESS_CONTROL_REQUEST_HEADERS = "Access-Control-Request-Headers";
    public static final String ACCESS_CONTROL_REQUEST_METHOD = "Access-Control-Request-Method";
    public static final String AGE = "Age";
    public static final String ALLOW = "Allow";
    public static final String AUTHORIZATION = "Authorization";
    public static final String CACHE_CONTROL = "Cache-Control";
    public static final String CONNECTION = "Connection";
    public static final String CONTENT_ENCODING = "Content-Encoding";
    public static final String CONTENT_DISPOSITION = "Content-Disposition";
    public static final String CONTENT_LANGUAGE = "Content-Language";
    public static final String CONTENT_LENGTH = "Content-Length";
    public static final String CONTENT_LOCATION = "Content-Location";
    public static final String CONTENT_RANGE = "Content-Range";
    public static final String CONTENT_TYPE = "Content-Type";
    public static final String COOKIE = "Cookie";
    .........
哦,header封装的还算好理解。

public class ResponseEntity<T> extends HttpEntity<T> {
    private final Object statusCode;

    public ResponseEntity(HttpStatus status) {
        this((Object)null, (MultiValueMap)null, (HttpStatus)status);
    }

    public ResponseEntity(T body, HttpStatus status) {
        this(body, (MultiValueMap)null, (HttpStatus)status);
    }

    public ResponseEntity(MultiValueMap<String, String> headers, HttpStatus status) {
        this((Object)null, headers, (HttpStatus)status);
    }

    public ResponseEntity(T body, MultiValueMap<String, String> headers, HttpStatus status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.statusCode = status;
    }.........
ResponseEntity看的有点不知所述,最后一行我传了文件实体,响应头,状态。而这里,实体和响应头交给父类方法处理,状态赋值给了本类的final常量。再看:

public class HttpEntity<T> {
    public static final HttpEntity<?> EMPTY = new HttpEntity();
    private final HttpHeaders headers;
    private final T body;

    protected HttpEntity() {
        this((Object)null, (MultiValueMap)null);
    }

    public HttpEntity(T body) {
        this(body, (MultiValueMap)null);
    }

    public HttpEntity(MultiValueMap<String, String> headers) {
        this((Object)null, headers);
    }

    public HttpEntity(T body, MultiValueMap<String, String> headers) {
        this.body = body;
        HttpHeaders tempHeaders = new HttpHeaders();
        if(headers != null) {
            tempHeaders.putAll(headers);
        }

        this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
    }
这个类直接将文件实体赋值给本类final实体,响应头经过处理也同样交给本类final响应头。

看到这里似乎就结束,也没看出个所以然……以本人耐心,我没追究,接着就是试验代码是否正确,于是得到如下:




似乎没问题,然后就打开文件……然后……然后就坑爹了。文件乱码,图片打开失败!

然后只能求助度娘,某同志给出这样一个答案:

            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <!-- 将Jackson2HttpMessageConverter的默认格式化输出为false -->
            <bean
                    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
                <property name="prettyPrint" value="false"/>
                <property name="objectMapper">
                    <bean class="com.csstj.plateform.common.mapper.JsonMapper"></bean>
                </property>
            </bean>
ByteArrayHttpMessageConverter放在json配置前,如果没有就添加一个。

再试果然ok了。

至于为什么,暂搁置,容我再探究下。









Spring开发工具包 Spring开发工具包,Spring开发工具包,Spring开发工具包 立即下载

相关推荐

官方源码 spring-framework-5.3.4.zip

官方源码 spring-framework-5.3.4.zip官方源码 spring-framework-5.3.4.zip

Mvn&springMVC配置

Mvn&springMVC配置 新建maven项目 web app原型 添加springmvc所需依赖 <!-- spring start --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${sprin

weixin_39016575的博客 547

spring最新版本下载地址

spring官网改版后 download不提供zip包下载,必须用maven了,想下载最新还得学maven,对我朝用户苦逼之级,现发现一个网址可以下载最新版本,故共享出来,要1分资源分的目的是想让大家下载后评论下 谢谢

SpringMVC上传文件下载后显示乱码问题

JAVA代码层面: @RequestMapping(value = "/getAttachmentFile.action") public ResponseEntity<byte[]> getAttachmentFile(HttpServletRequest request, ...

qq_34749144的博客 749

spring-webflux 5.3.41版本jar包

spring-webflux 5.3.41版本jar包

spring-webmvc-5.3.4.jar中文-英文对照文档.zip

# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

SpringMVC上传和下载文件系列问题

参考博客:https://blog.csdn.net/qq_33764491/article/details/77440180                   https://www.cnblogs.com/WJ-163/p/6269409.html 1 SpringMVC文件上传 1.1jsp页面的form表单    这里enctype一定要写multipart/form-data...

xiaoy990的博客 303

spring-webmvc-5.3.4.jar中文文档.zip

1、压缩文件中包含: 中文文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。

springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题)

springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题) 公司的上网行为管理系统项目有一个功能模块是统计报表,今天在完成这个功能的过程中碰到一个需求:将服务器上的PDF文件以附件的形式下载到本地。 马上想起springMVC提供了文件下载的功能,非常开心。然而,不碰上点bug不足以写博客啊! 先贴完整代码: public ResponseEntity<byte

一棵小树 4680

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

数学之美 | 图论和网络爬虫

文章目录概述图论网络爬虫分析BFSDFSBFS + DFS参考资料 概述 这篇文章主要给大家介绍一下计算机算法中非常重要的一部分——图论,以及它在生活中的应用——网络爬虫。   图论 离散数学是当代数学的一个重要的分支,也是计算机科学的数学基础。它又包括四个分支,而图论便是其中一支,另外三个分别是:数理逻辑、集合论、近代数学。 图论中的图由一些节点和边构成,比如下面这张图 。 在图论中一个很基础...

小小酥梨的博客 3231

java mvc框架下载文件_关于SpringMvc下载文件时自定义文件名的问题

是这样的,我们的项目用的框架是SpringMvc+Spring+Mybatis,其中有一个下载文件的功能,在下载下来的时候需要对其自定义文件名,我们在本地测试这个功能毫无问题,试了几台电脑都行,然后我们把它发布到服务器上去,服务器环境是Tomcat7.0+Jdk1.8和本地开发环境一样,但是测试下载功能的时候,下载下来的文件的文件名就变成了download这是本地测试的情况,文件名和显示的文件名一...

weixin_33585909的博客 585

K-means在关键词聚类中的尝试

K-means在文本聚类中的尝试 K-means算法是无监督的聚类算法。它的算法思想是:先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。 K-means算法的关键点在于: 初始k个聚类中心的选择 距离的计...

BigPig_LittleTail的博客 5573

springmvc文件下载之文件名下划线问题终极解决方案

springmvc文件下载之文件名下划线问题终极解决方案

hijk7的博客 173

Bulk / Smart-seq2数据分析一般流程

Bulk RNA-seq(RNA-Seq of bulk samples)是一种RNA-Seq技术应用,它是通过将整个组织或细胞群体的RNA提取并混合,进行高通量测序来分析基因表达的技术。转录本定量结果可以用于后续的差异表达分析和聚类分析。功能注释和富集分析:对差异表达基因进行功能注释和富集分析,以帮助理解差异表达基因的功能和调控网络,从而获得对研究样品的更深入的理解。数据可视化:最后,将聚类分析的结果进行可视化,可以使用常见的数据可视化工具,如ggplot2、Plotly等,来帮助用户更好地理解数据。

weixin_54519672的博客 5350

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1265

springMVC实现文件下载功能(解决火狐浏览器文件名乱码问题)

项目中经常遇到文件上传下载的功能,springMVC里也提供了文件上传下载的相关功能,下面直接上代码,使用springmvc的ResponseEntity实现日志文件下载。 下载的流程: 1.获取文件源(我这里是String类型的文本日志) 2.将源文件转化为对应的输入流 3.将输入流读取到缓冲区 4.设置浏览器请求头信息,请求状态 5.把流以ResponseEntity的形式返回给客...

shemuel的技术笔记 3442

Flowable任务节点动态预测:基于任务ID与参数获取下一节点及候选分配策略

本文深入探讨了Flowable工作流引擎中任务节点动态预测功能的实现。通过解析任务ID与运行时参数,模拟流程执行路径,精准预测下一节点及候选用户/组集合,从而提升用户体验与系统透明度。核心在于利用自定义命令实现表达式求值,并深度解析候选者分配策略,确保预测结果与实际流程执行一致。

nnn11的博客 739

SpringMVC的文件下载及中文编码问题

首先配置web.xml文件 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://ja

lhc0512的博客 1726

基于PSINS的INS/NHC/ODO组合导航仿真全解析

组合导航通过多传感器融合克服单一导航系统的局限,是车辆自主定位的关键技术。其中惯性导航(INS)依靠陀螺仪与加速度计积分推算运动状态,但误差随时间累积;GNSS提供绝对位置,却在城市峡谷中易受多径效应和遮挡影响导致定位漂移。卡尔曼滤波作为信息融合核心,将不同量测按统计特性加权,实现优势互补。基于PSINS开源工具箱搭建的SINS/GNSS/ODO/NHC组合导航仿真,能够在GNSS失锁条件下利用非完整约束和里程计抑制惯性误差发散,广泛应用于无人驾驶、物流车辆自主定位等场景。本文围绕PSINS仿真环境,详细拆

weixin_29044713的博客 253

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2899

SpringMVC中的文件的上传和下载问题

SpringMVC中的文件的上传和下载问题 一、文件的上传 1、导包 SpringMVC的文件上传依赖于Apache的FileUpload组件 <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId>

weixin_47084857的博客 368

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于利用SpringMVC下载方法在IE11中无法正常下载文件的问题

问题描述:在SpringMVC框架下写了一个文件下载的方法,在火狐和谷歌浏览器下载正常,但在IE11中无法正常下载,如同所示:解决方案:利用F12浏览器调试工具发现,下载链接的返回状态码是201,如图所示:IE11浏览器不支持201返回码,下载方法中改为200就可以正常下载啦,原方法:修改后:问题解决!!!

fengj_j的专栏 871

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

springmvc的乱码问题及文件上传下载

1. 解决乱码问题1.配置tomcat为UTF-8 (URIEncoing=”UTF-8”) 2.配置过滤器(配置characterEncodingFilter类中的encoding(设置request),forceEncoding(设置response)) encodingFilter org.springframework.web.filter.CharacterEncoding

AAA_BBB 786

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于SpringMVC的文件上传下载及显示问题

首先,不得不感慨spring框架的强大,学习了很久还是发现很多东西都只是理解了皮毛,但是往往你所能想到的功能,都可以用编码来实现,只不过效率高低取决于采取什么方法。 今天在完善我的《教务信息管理系统》项目时,构想如下: 教师登录自己的教师系统,可以查看到自己所教授的课程,同时可以进行给学生打分、上传课件等操作; 学生登录自己的学生系统,在已选课程列表可以...

一点思考 2094
上一篇: java解惑学习经历(一)
下一篇: shiro二,集成web时url过滤
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值