Java文件下载代码及中文文件名不显示的问题

@GetMapping("/downloadOrderDemo")
    public ResponseEntity<Resource> downloadFile() throws IOException {
        // 读取文件内容
        File file = new File(System.getProperty("user.dir") + File.separator + "work-order/src/main/java/com/workorder/file/模版.xlsx");
        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

        // 设置 HTTP 响应头信息
        HttpHeaders headers = new HttpHeaders();
        String fileName = "模版.xlsx";
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName);

        // 返回文件内容
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }

1.上述代码中,@GetMapping("/download") 注解指定了这是一个 GET 请求,并且路径为 /file/downloadResponseEntity<Resource> 类型的返回值表示该接口会返回一个文件资源。在接口的实现中,我们首先读取文件内容,然后设置 HTTP 响应头信息,最后将文件内容封装在 ResponseEntity 中返回。

需要注意的是,上述代码中的文件路径是硬编码在代码中的,实际应用中应该将其配置在配置文件中或者通过其他方式动态获取。另外,上述代码中使用了 InputStreamResource 类来将文件内容转换为 Resource,这是 Spring 框架提供的一个抽象类,用于表示任何可以被读取的资源。如果你的应用需要支持大文件下载,可以使用 StreamingResponseBody 类来实现。

2.在上述代码中,首先使用 URLEncoder.encode 方法对文件名进行 UTF-8 编码,然后将编码后的文件名添加到 HTTP 响应头的 Content-Disposition 属性中。需要注意的是,由于 RFC 6266 规范建议使用 RFC 5987 格式来传递编码后的文件名,因此上述代码中使用了 filename*=UTF-8'' 来指定编码方式。

posted @ 2023-04-18 15:05  ZZZZZZa  阅读(186)  评论(0编辑  收藏  举报