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


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

    1. package com.example.springboot.service.impl;
    2. import com.alibaba.excel.EasyExcel;
    3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    4. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
    5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    6. import com.example.springboot.base.Pager;
    7. import com.example.springboot.dto.SongInsertDTO;
    8. import com.example.springboot.dto.SongPagerDTO;
    9. import com.example.springboot.dto.SongUpdateDTO;
    10. import com.example.springboot.entity.Song;
    11. import com.example.springboot.mapper.SongMapper;
    12. import com.example.springboot.restful.JsonResult;
    13. import com.example.springboot.service.SongService;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. import org.springframework.stereotype.Service;
    16. import javax.servlet.http.HttpServletResponse;
    17. import java.io.IOException;
    18. import java.time.LocalDateTime;
    19. import java.time.format.DateTimeFormatter;
    20. import java.util.List;
    21. /**
    22. * @author heyunlin
    23. * @version 1.0
    24. */
    25. @Service
    26. public class SongServiceImpl implements SongService {
    27. private final SongMapper songMapper;
    28. @Autowired
    29. public SongServiceImpl(SongMapper songMapper) {
    30. this.songMapper = songMapper;
    31. }
    32. @Override
    33. public void insert(SongInsertDTO insertDTO) {
    34. Song song = new Song();
    35. song.setId(uuid());
    36. song.setName(insertDTO.getName());
    37. song.setSinger(insertDTO.getSinger());
    38. if (StringUtils.isNotEmpty(insertDTO.getNote())) {
    39. song.setNote(insertDTO.getNote());
    40. }
    41. songMapper.insert(song);
    42. }
    43. @Override
    44. public void deleteById(String id) {
    45. songMapper.deleteById(id);
    46. }
    47. @Override
    48. public void updateById(SongUpdateDTO updateDTO) {
    49. Song song = new Song();
    50. song.setId(updateDTO.getId());
    51. song.setName(updateDTO.getName());
    52. song.setSinger(updateDTO.getSinger());
    53. if (StringUtils.isNotEmpty(updateDTO.getNote())) {
    54. song.setNote(updateDTO.getNote());
    55. }
    56. song.setLastUpdateTime(LocalDateTime.now());
    57. songMapper.updateById(song);
    58. }
    59. @Override
    60. public Song selectById(String id) {
    61. return songMapper.selectById(id);
    62. }
    63. @Override
    64. public List selectList() {
    65. return songMapper.selectList(null);
    66. }
    67. @Override
    68. public Page selectByPage(SongPagerDTO songPagerDTO) {
    69. QueryWrapper wrapper = Pager.getQueryWrapper(songPagerDTO, true);
    70. Page page = Pager.ofPage(songPagerDTO);
    71. return songMapper.selectPage(page, wrapper);
    72. }
    73. @Override
    74. public void export(HttpServletResponse response) {
    75. String fileName = "歌曲列表.xlsx";
    76. response.setCharacterEncoding("utf-8");
    77. response.setHeader("Content-disposition", "attachment;filename=" + fileName);
    78. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    79. try {
    80. List songs = songMapper.selectList(null);
    81. EasyExcel.write(response.getOutputStream(), Song.class).sheet("歌曲列表").doWrite(songs);
    82. } catch (Exception e) {
    83. e.printStackTrace();
    84. response.reset();
    85. response.setContentType("application/json;charset=utf-8");
    86. JsonResult jsonResult = JsonResult.success("数据导出异常");
    87. try {
    88. response.getWriter().write(jsonResult.toString());
    89. } catch (IOException ioException) {
    90. ioException.printStackTrace();
    91. }
    92. }
    93. }
    94. /**
    95. * 根据当前时间生成UUID
    96. * @return String
    97. */
    98. private static String uuid() {
    99. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    100. LocalDateTime localDate = LocalDateTime.now();
    101. return localDate.format(formatter);
    102. }
    103. }

     

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

     

    文件的内容也是正常的

     

    后台也没报错

     

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

     

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

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

  • 相关阅读:
    windows命令行查看和终止进程
    OpenCascade模型解析-详细分解模型结构
    LeetCode75——Day1
    大气污染扩散模型Calpuff建模、数据后处理及应用
    汽车工业能效管理平台助力能源管理体系的建立和实施
    Linux高负载排查最佳实践
    玩转微服务-SonarQube
    Mybatis的一对一和一对多的标签介绍
    日常开发方案设计指北
    MyBatis 入门
  • 原文地址:https://blog.csdn.net/heyl163_/article/details/134400255