Le code Java impliqué est le suivant : une fois téléchargé, le nom du fichier est chinois.
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);
}
}
Ensuite, le téléchargement est très rapide, mais le nom du fichier a disparu
Le contenu du fichier est également normal
Aucune erreur n'a été signalée en arrière-plan
Généralement, vous ne savez peut-être pas quoi faire dans cette situation. Ouvrez la console avec F12 et jetez un œil. Vous constaterez que le nom de fichier de l'en-tête de réponse Content-disposition défini par le backend est tronqué !
Solution finale : encoder le nom de fichier au format utf-8
String fileName = URLEncoder.encode("歌曲列表.xlsx", "utf-8");