如何在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
相关产品推荐
相关产品推荐

