You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在REST控制器中指定文件下载的自定义文件名?

如何让Spring REST控制器返回PDF时使用自定义文件名

当然可以解决这个问题!你当前的代码只是返回了PDF的字节数据,但没有告诉浏览器该用什么文件名,所以浏览器只能使用默认的命名规则。核心解决方案是通过设置**Content-Disposition**响应头来指定自定义文件名,下面给你两种常用的实现方式:

方案一:使用ResponseEntity封装响应(推荐)

这种方式更符合Spring的REST风格,通过ResponseEntity可以优雅地封装响应体和响应头:

@GetMapping(value="/{filename}", produces= MediaType.APPLICATION_PDF_VALUE)
public ResponseEntity<byte[]> letItTry(@PathVariable("filename") String filename) {
    try {
        byte[] pdfBytes = download(filename);
        HttpHeaders headers = new HttpHeaders();
        
        // 设置响应头:指定文件名,这里用"Custom_PDF_Name.pdf"作为示例
        // 如果希望浏览器直接在页面内打开PDF(而非下载),把"attachment"改成"inline"即可
        headers.setContentDispositionFormData("attachment", "Custom_PDF_Name.pdf");
        
        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.OK);
    } catch (Exception ex) {
        return new ResponseEntity<>(new byte[0], HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

动态文件名适配

如果你的文件名需要根据请求参数动态生成(比如用路径里的filename参数),直接替换即可:

headers.setContentDispositionFormData("attachment", filename);

方案二:直接操作HttpServletResponse设置响应头

如果你不想改动返回值类型,也可以在方法中注入HttpServletResponse,手动设置响应头:

@GetMapping(value="/{filename}", produces= MediaType.APPLICATION_PDF_VALUE)
public @ResponseBody byte[] letItTry(@PathVariable("filename") String filename, HttpServletResponse response) {
    try {
        // 设置Content-Disposition头,指定自定义文件名
        response.setHeader("Content-Disposition", "attachment; filename=\"Custom_PDF_Name.pdf\"");
        
        // 若需要浏览器内打开PDF,替换为:
        // response.setHeader("Content-Disposition", "inline; filename=\"Custom_PDF_Name.pdf\"");
        
        return download(filename);
    } catch (Exception ex) {
        return new byte[0];
    }
}

注意事项:处理特殊字符/中文文件名

如果文件名包含中文或者特殊字符,直接设置可能会出现乱码问题,建议对文件名进行URL编码:

String encodedFilename = URLEncoder.encode("我的专属文档.pdf", StandardCharsets.UTF_8.toString());
// 兼容多浏览器的写法
response.setHeader("Content-Disposition", String.format("attachment; filename*=UTF-8''%s", encodedFilename));

这样设置后,浏览器就会使用你指定的自定义文件名来处理返回的PDF文档了。

内容的提问来源于stack exchange,提问作者meridbt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:37:52