需求:
发起下载文件,下载文件,中文文件名称无乱码。
@RestController
public class DownloadDemoController {
@GetMapping("/download/byte/{filename}")
public ResponseEntity<byte[]> downloadFile2(@PathVariable String filename) {
Supplier<Optional<byte[]>> fileContentSupplier = () -> {
Path filePath = Paths.get("/Users/nanan/Desktop/" + filename); // 替换为实际文件路径
if (!Files.exists(filePath)) {
return Optional.empty();
}
try {
byte[] fileBytes = Files.readAllBytes(filePath);
return Optional.of(fileBytes);
} catch (IOException e) {
// 记录日志或进行其他处理
System.err.println("Error reading file: " + e.getMessage());
return Optional.empty();
}
};
// 如果文件内容为空,返回 404 响应
return fileContentSupplier.get().map(fileBytes -> {
HttpHeaders headers = new HttpHeaders();
try {
// 中文名称乱码问题
String encodedFilename = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString());
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename);
} catch (UnsupportedEncodingException e) {
System.err.println("Error encoding filename: " + e.getMessage());
}
return ResponseEntity.ok()
.headers(headers)
.contentLength(fileBytes.length)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(fileBytes);
}).orElseGet(() -> ResponseEntity.notFound().build()); // 文件不存在时返回404
}
}