Spring MVC 优雅下载和文件名正常显示

使用 Spring MVC 的 ResponseEntity 传入文件的字节码即可实现下载功能,不用往HttpServletResponse response 的输出流写字节了。

public class BasicController {
    protected ResponseEntity<byte[]> getFile(String fileName, byte[] dataArray) throws Exception {
        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename*=utf-8''" + fileName);
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(dataArray);
    }

    protected ResponseEntity<byte[]> getExcelFile(String fileName, byte[] dataArray) throws Exception {
//        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
        // Safari 和 Chrome 都可以正常下载包含中文文件名的 excel 文件
        fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename*=utf-8''" + fileName);
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        headers.add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        return ResponseEntity
                .ok()
                .headers(headers)
                .body(dataArray);
    }
}

getFile 方法在 Safari 浏览器不能正常下载 Excel 文件,下载的是一个后缀名为 .dms 文件。getExcelFile 指定 Excel 的 MIME 类型,并将文件名编码为 ISO_8859_1,兼容 Chrome 和 Safari 的下载。

@RestController
public class FileProcessController extends BasicController {
    @GetMapping("/test/download")
    public ResponseEntity<byte[]> downloadFile(d) throws Exception {
    	 // 得到文件的字节数组 
    	 byte[] dataArray = getData(); 
        return this.getExcelFile("excel-文件下载.xlsx", dataArray);
    }
}

在浏览器里模拟一下:

Spring MVC 文件下载测试: <a href="http://localhost:8080/test/download">点击下载</a>

在这里插入图片描述
我当时在项目里测试的时候,因为没有 Cookie,请求后端则没有权限,
在 Chrome 或 Safari 开发者工具的 Console 用:

document.cookie="COOKIE_KEY=COOKIE_VALUE";

设置请求 Cookie。
在这里插入图片描述
参考:解决各大浏览器下载文件名显示不正确的情况
java实现浏览器下载文件,并解决兼容各浏览器的乱码与后缀问题
Spring MVC 文件下载及中文文件名乱码解决

CentOS 7上安装Qt,可以按照以下步骤进行操作: 1. 首先,确保已经安装了gcc编译器。可以通过在终端执行命令`gcc -v`来检查是否已安装gcc。如果没有安装gcc或者需要更高版本的gcc,可以使用yum来安装或更新gcc。 2. 下载Qt安装包,可以从官方网站上下载相应的版本。然后将安装包解压到指定的目录。 3. 授权安装脚本的执行权限,可以使用`chmod +x filename`命令来给脚本文件添加执行权限。 4. 执行安装脚本,运行`./qt-installer.run`命令来启动可视化安装界面。按照界面提示进行安装,可以选择安装路径和组件。 5. 安装完成后,可以在安装路径下找到Qt的可执行文件,比如`/opt/Qt/Qt5.15.2/Tools/QtCreator/bin/qtcreator`。可以通过命令行或者图形界面启动Qt Creator。 以上是在CentOS 7上安装Qt的一般步骤,具体操作可能会因版本或其他因素而有所不同。建议在安装前仔细阅读相应的安装文档或官方指导,以确保正确安装和配置Qt。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [centos7安装QT及环境配置](https://blog.youkuaiyun.com/m0_57931726/article/details/120180973)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Centos7安装Qt](https://download.youkuaiyun.com/download/weixin_38522552/14040126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值