Safari浏览器下载文件时,文件名会URL encoded

问题:相同链接下载文件,safari文件名编码异常

解决:response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode(filename, "UTF-8"));

问题描述

  • 谷歌下载(正常)

  • Safari下载(异常)

问题代码示例

@RestController
@RequestMapping("/file")
public class FileController {

    @GetMapping("/download")
    public void download(HttpServletResponse response) {
        String filename = "图片.jpg";
        String path = "img/" + filename;
        ClassPathResource classPathResource = new ClassPathResource(path);

        try (FileInputStream fis = new FileInputStream(classPathResource.getFile());
             ServletOutputStream sos = response.getOutputStream()) {
            //设置响应头
        	response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));

            IOUtils.copy(fis, sos);
        } catch (Exception e) {
            throw new RuntimeException("下载失败!");
        }
    }
}

问题解决如下

@RestController
@RequestMapping("/file")
public class FileController {

    @GetMapping("/download")
    public void download(HttpServletResponse response) {
        String filename = "图片.jpg";
        String path = "img/" + filename; // resources下路径,比如文件位置在:resources/img/图片.jpg
        ClassPathResource classPathResource = new ClassPathResource(path);

        try (FileInputStream fis = new FileInputStream(classPathResource.getFile());
             ServletOutputStream sos = response.getOutputStream()) {
            //设置响应头
            response.setHeader("Content-Disposition", "attachment;filename*=utf-8''"
                    + URLEncoder.encode(filename, "UTF-8"));

            IOUtils.copy(fis, sos);
        } catch (Exception e) {
            throw new RuntimeException("下载失败!");
        }
    }
}

关键代码

response.setHeader("Content-Disposition", "attachment;filename*=utf-8''"
                    + URLEncoder.encode(filename, "UTF-8"));

下载后文件名正常

文章参考

Safari浏览器下载文件时,文件名会URL encoded

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用AI帮助设计师提升工作效率?

在创意设计的世界里,效率往往意味着灵感与时间的完美结合。设计师们时常面临各种挑战,如何在保证作品质量的同时,又能提升工作效率?这不仅是设计师们思考的问题,也是AI技术正在积极解决的问题。那么,用AI帮…

2024年6月11日树莓派正式上市!

​Raspberry Pi 已在伦敦证券交易所上市,股票代码为 Raspberry Pi Holdings plc。 这是 Raspberry Pi 的分水岭,也是发展新阶段的开始:进入公开市场将使树莓派能够更快地制造出更多我们喜爱的产品。Raspberry Pi 基金会在首次公开募股中筹得的…

网络文化经营许可证:互联网时代的护航之舵

文网文由中国文化和旅游部(原文化部)颁发,旨在对网络文化活动进行规范管理,确保文化内容的健康积极。通过对文化市场的严格监管,文网文有效杜绝了低俗、违法、侵权等不良现象的发生。网络文化市场的良性发展&#xff0…

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网:www.icairc.net 录用通知时间&…

Lucene重要特性及应用案例

文章目录 Elasticsearch Python 示例Lucene Java 示例Elasticsearch Python 示例进阶:多字段搜索与排序Lucene Java 示例进阶:使用TermQuery进行精确匹配 Lucene底层存储结构: Lucene作为高性能的全文搜索引擎库,其底层存储结构设…

【C++】类和对象(三)构造与析构

文章目录 一、类的6个默认成员函数二、 构造函数干嘛的?语法定义特性综上总结什么是默认构造函数? 三、析构函数干嘛的 ?语法定义析构顺序 一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中并不是真的什么…

不懂索引,简历上都不敢写自己熟悉SQL优化

大家好,我是考哥。 今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握SQL优化还重要,索引是优化SQL的前提和基础,我们一步步来先打好地基。 当MySQL表数据量不大时,缺少索引对查询性能的影响不会太大&#x…

在react项目中让webpack使用mock数据

1. 创建react项目 使用 create-react-app 创建项目 npx create-react-app react-mock 执行 eject 命令 npm run eject 删除 package.json 文件中的 eslintConfig 选项 2. 安装依赖包 npm i path-to-regexp fast-glob chokidar axios 3. 创建中间件 在 config 文件夹中创…

Android【SDK】 SDK是如何开发的,怎么打包aar包

文章目录 一、Android SDK开发示例工程二、Android SDK的开发三、打包aar包四、Android SDK的使用 一、Android SDK开发示例工程 本教程工程Git链接:https://gitcode.com/xiaohuihui1400/AndroidSdkExample/overview 二、Android SDK的开发 新建项目,…

Linux驱动开发笔记(九)IIC子系统及其驱动

文章目录 前言一、IIC驱动框架二、总线驱动2.1 iic总线的运行机制2.2 重要数据结构2.2.1 i2c_driver结构体2.2.2 i2c总线结构体 2.3 匹配规则 三、设备树的修改四、设备驱动的编写4.1 相关API函数4.1.1 i2c_add_adapter( )4.1.2 i2c_register_driver( )4.1.3 i2c_transfer( )4.…

MDK-ARM 编译后 MAP 文件分析

本文配合 STM32 堆栈空间分布 食用更佳! 一图胜千言。。。

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架,用于评估基于大型语言模型(LLM)的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率,以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

ICC2如何写DCG需要的floorplan信息

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 DCG需要哪些floorplan信息呢? 1)fixed属性的port和mem / ip / io 2)boundary信息 3)电源域形状 前两条都可以写到def里,电源域需要用脚本处理,这里分享一下脚本。 set_fixed_objects [ge…

# 消息中间件 RocketMQ 高级功能和源码分析(七)

消息中间件 RocketMQ 高级功能和源码分析(七) 一、 消息中间件 RocketMQ 源码分析:消息存储核心类介绍 1、消息存储在 store 模块中。消息存储核心类 DefaultMessageStore.java 2、消息存储核心类介绍 private final MessageStoreConfig me…

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时,子组件接收到的 children 是一个数组,通过解析数组中各 JSX 的属性 slot ,即可实现具名插槽的分发! 代码实现 Father.jsx import Child from "./Child";…

DNF安卓分离仅是开始:游戏厂商积极布局自有渠道,市场变革在即

毫无征兆,DNF手游今天突然宣布从各大安卓平台下架。 《地下城与勇士:起源》运营团队于6月19日发布声明,指出因合约到期,游戏将不再上架部分安卓平台的应用商店。然而,这一事件并非完全无迹可循。 早在2021年初,华为游…

ROM以及ROM与RAM对比

1.ROM ROM最原始的定义是“只读存储器”,一旦写入原始信息则不能更改。所以ROM通常用来存放固定不变的程序、常数和汉字字库,甚至用于操作系统的固化。它与随机存储器可共同作为主存的一部分,统一构成主存的地址域。 现在已经发展出了很多R…

商超便利店收银系统源码推荐

细节决定成败,无论是做什么事情都要注重细节,让我们来看看关于商超便利店陈列的“细节”有哪些需要注意的地方。 首先要注意商品不要摆太高,放在适当位置即可! 商超便利店内,销量最佳的物品摆放位置依次为与顾客视线…

ICC2如何写出floorplan信息

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 1)write_def 不用-exclude 的话rows_tracks / vias /blockages / routing_rules信息都会写出去,即便用了-include {macro ports}也不行,所以不介意这些东西的话可以用以下两种种def方式去写f…

RabbitMQ的简单使用 —— Python篇

(一)RabbitMQ的简介 RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完…