下载文件时的文件名中文乱码问题,文件名丢失

涉及到的java代码如下,下载的时候文件名为中文

package com.example.springboot.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springboot.base.Pager;
import com.example.springboot.dto.SongInsertDTO;
import com.example.springboot.dto.SongPagerDTO;
import com.example.springboot.dto.SongUpdateDTO;
import com.example.springboot.entity.Song;
import com.example.springboot.mapper.SongMapper;
import com.example.springboot.restful.JsonResult;
import com.example.springboot.service.SongService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@Service
public class SongServiceImpl implements SongService {

    private final SongMapper songMapper;

    @Autowired
    public SongServiceImpl(SongMapper songMapper) {
        this.songMapper = songMapper;
    }

    @Override
    public void insert(SongInsertDTO insertDTO) {
        Song song = new Song();

        song.setId(uuid());
        song.setName(insertDTO.getName());
        song.setSinger(insertDTO.getSinger());

        if (StringUtils.isNotEmpty(insertDTO.getNote())) {
            song.setNote(insertDTO.getNote());
        }

        songMapper.insert(song);
    }

    @Override
    public void deleteById(String id) {
        songMapper.deleteById(id);
    }

    @Override
    public void updateById(SongUpdateDTO updateDTO) {
        Song song = new Song();

        song.setId(updateDTO.getId());
        song.setName(updateDTO.getName());
        song.setSinger(updateDTO.getSinger());

        if (StringUtils.isNotEmpty(updateDTO.getNote())) {
            song.setNote(updateDTO.getNote());
        }
        song.setLastUpdateTime(LocalDateTime.now());

        songMapper.updateById(song);
    }

    @Override
    public Song selectById(String id) {
        return songMapper.selectById(id);
    }

    @Override
    public List<Song> selectList() {
        return songMapper.selectList(null);
    }

    @Override
    public Page<Song> selectByPage(SongPagerDTO songPagerDTO) {
        QueryWrapper<Song> wrapper = Pager.getQueryWrapper(songPagerDTO, true);
        Page<Song> page = Pager.ofPage(songPagerDTO);

        return songMapper.selectPage(page, wrapper);
    }

    @Override
    public void export(HttpServletResponse response) {
        String fileName = "歌曲列表.xlsx";

        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

        try {
            List<Song> songs = songMapper.selectList(null);

            EasyExcel.write(response.getOutputStream(), Song.class).sheet("歌曲列表").doWrite(songs);
        } catch (Exception e) {
            e.printStackTrace();

            response.reset();
            response.setContentType("application/json;charset=utf-8");
            JsonResult<Void> jsonResult = JsonResult.success("数据导出异常");

            try {
                response.getWriter().write(jsonResult.toString());
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    /**
     * 根据当前时间生成UUID
     * @return String
     */
    private static String uuid() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime localDate = LocalDateTime.now();

        return localDate.format(formatter);
    }

}

 

然后下载很快,但是文件名没有了

 

文件的内容也是正常的

 

后台也没报错

 

一般这种情况下可能会无从下手,F12打开控制台看一下,发现后端设置的响应头Content-disposition的文件名乱码了!

 

最终解决方案:使用utf-8格式对文件名进行编码

String fileName = URLEncoder.encode("歌曲列表.xlsx", "utf-8");

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

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

相关文章

【nlp】2.4 GRU模型

GRU模型 1 GRU介绍2 GRU的内部结构图2.1 GRU结构分析2.2 Bi-GRU介绍2.3 使用Pytorch构建GRU模型2.4 GRU优缺点3 RNN及其变体1 GRU介绍 GRU(Gated Recurrent Unit)也称门控循环单元结构, 它也是传统RNN的变体, 同LSTM一样能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆…

上海国际集团党委副书记、总裁刘信义一行莅临ZStack调研指导

11月10日&#xff0c;上海国际集团有限公司党委副书记、总裁刘信义率上海国际集团、上海国资经营及国鑫创投领导莅临上海云轴信息科技有限公司&#xff08;简称“云轴科技ZStack”&#xff09;调研指导&#xff0c;云轴科技ZStack创始人、董事长张鑫&#xff0c;携公司管理团队…

最新宝塔反代openai官方API开发接口详细搭建教程,解决502 Bad Gateway问题

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外服务器…

鸿蒙系统扫盲(一):鸿蒙OS和开源鸿蒙什么关系?

我们经常提到鸿蒙&#xff0c;但是大家都分不清鸿蒙OS&#xff08;Harmony OS&#xff09;和 开源鸿蒙&#xff08;Open Harmony&#xff09;的区别&#xff1f; 1.开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行…

【C++】join ()和detach ()函数详解和示例

简单的来说&#xff0c;join ()方法建立的线程具有阻碍作用&#xff0c;该线程不结束&#xff0c;另一些函数就无法运行。detach ()方法建立的线程&#xff0c;可以和另一些函数同时进行。下面以示例进行详细说明&#xff0c;以帮助大家理解和使用。 目录 join ()detach () jo…

asp.net core mvc之 局部视图 和视图组件

一、局部视图是什么&#xff1f; 1、局部视图也是 .cshtml文件 2、将重复使用的内容&#xff08;如&#xff1a;右侧栏&#xff09;&#xff0c;做出局部视图&#xff0c;供其他视图调用 3、局部视图不会执行 _ViewStart.cshtml 二、局部视图示例 1、在 /Views/Shared目录右…

python合并多个CSV文件成一个

之前写的是合并Excel&#xff0c;这次是操作CSV文件&#xff0c;可以看到文件非常多 每一个文件里面前两行是表头&#xff0c;无关信息&#xff0c;因此合并的时候需要略过&#xff1a; python代码如下&#xff1a; import os import csv# 输入文件夹路径和输出文件路径 inp…

印刷设备丝杆选择研磨杆还是冷轧杆好?

在印刷设备中&#xff0c;选择研磨杆还是冷轧杆取决于具体的使用需求和设备要求。以下是关于两种丝杆选择的要点&#xff1a; 1、精度要求&#xff1a;研磨杆通常具有更高的制造精度&#xff0c;能够有效保证印刷设备的精度和稳定性。研磨杆经过精细研磨和校准&#xff0c;具有…

Python语言:文件的操作与使用

Python语言可以对电脑中的文件进行一系列操作&#xff0c;包括文件的打开与关闭&#xff0c;文件内容的读取和追加等。 打开文件 语法&#xff1a;使用open函数 使用python语言的内置open函数打开一个文件&#xff0c;里面有三个参数可以指定文件的路径&#xff0c;操作方式&a…

python实现双臂老虎机k-armed-bandit

老虎机&#xff0c;投入钱币会随机返还钱币&#xff08;reward&#xff09; 这里设置两台老虎机&#xff0c;一台均值500&#xff0c;标准差5&#xff0c;一台均值550&#xff0c;标准差10 初始值均为998&#xff0c;更新规则为reward之和/轮数 最后结果会在均值附近收敛 impo…

山东省技能兴鲁网络安全大赛 web方向

文章目录 购买FLAG日志里的FLAG一只小蜜蜂 购买FLAG 随便登录admin进去&#xff0c;发现有充值和购买功能 但是试试充值发现不行 购买页面如下 bp抓包看看&#xff0c;发现value值可控 我们试试将其改为正数&#xff0c;发现成功 购买得到flag 日志里的FLAG <?phphi…

创新的Sui项目在CoinDCX的Unfold 2023黑客松中获奖

近日&#xff0c;在印度班加罗尔&#xff08;Bengaluru&#xff09;&#xff0c;超过2500人参加了CoinDCX组织的综合性Web3活动Unfold 2023。作为讨论、聚会和活动的一部分&#xff0c;进行了一次多链黑客松&#xff0c;Sui联合赞助了该活动。所有团队&#xff0c;无论他们构建…

企业如何利用好用户画像对客户进行精准营销?提高营销转化?

随着市场竞争的加剧&#xff0c;企业对于客户的需求和行为越来越关注&#xff0c;如何利用好用户画像对客户进行精准营销&#xff0c;提高营销转化&#xff0c;成为企业关注的焦点。 一、了解用户需求和行为 首先&#xff0c;企业需要了解客户的需求和行为&#xff0c;包括客户…

Docker技术教程

利用Docker快速安装MySQL 运行结果如下&#xff1a;

C++入门(1)

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种&#xff1a; 第二种&#xff1a; 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

Springboot 程序实现加密,禁止 jadx 反编译

在Spring Boot中实现程序加密和禁止jadx反编译是一个复杂的问题。虽然无法完全禁止反编译&#xff0c;但可以通过一些技术手段来提高代码的安全性。 以下是一些可能的措施&#xff1a; 使用混淆工具&#xff1a;使用Java代码混淆工具&#xff08;如ProGuard或YGuard&#xff0…

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写&#xff0c;其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务&#xff0c; MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

Sandbox: bash(5613) deny(1) file-write-create 错误解决

Showing Recent Errors Only Sandbox: bash(5613) deny(1) file-write-create /Users/xx/Dev/UniappLearn/MSLUniappDemo/Pods/resources-to-copy-MSLUniappDemo.txt image.png 解决方法 build setting搜索ENABLE_USER_SCRIPT_SANDBOXING&#xff0c;YES&#xff08;默认&…

揭秘软件测试培训骗局:如何从贩卖焦虑到高薪包就业

你可能并不是一个IT行业的从业者&#xff0c;也可能是第一次听说软件测试工程师这个岗位。但由于看了某个网站的广告&#xff0c;或者听某个人说可以花钱培训软件测试技术&#xff0c;入职软件测试工程师岗位&#xff0c;于是动了这方面的心思。 但是互联网上有很多地方说&…

JavaScript中的原型和原型链

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 原型和原型链是JavaScript中一个重要且常常被误解的概念。它们在理解对象、继承和属性查找时扮演着关键的角色。 1…