HttpServletResponse addHeader 与 setHeader 区别

本文介绍了两种HTTP头部管理方法:setHeader用于设置或更新现有头部,若头部已存在则替换其值;addHeader用于添加新头部,若头部已存在则保留原值。
setHeader(name,value) :如果Header中没有定义则添加,如果已定义则用新的value替换原用value值。

addHeader(name,value) :如果Header中没有定义则添加,如果已定义则原有value不改变。
### Java Servlet 文件下载 `response.addHeader` 设置示例及参数说明 为了使浏览器能够识别并处理文件下载请求,在响应头中添加特定的 HTTP 头信息是非常重要的。这可以通过调用 `HttpServletResponse` 对象的方法来完成。 当准备向客户端发送文件时,应该先设置 MIME 类型,即 Content-Type 响应头部字段,告知浏览器即将接收的数据类型[^2]: ```java res.setContentType("application/octet-stream"); ``` 接着,利用 `addHeader()` 方法可以指定附加的信息给客户端。对于文件下载来说,最重要的是设置 `Content-Disposition` 这一头部字段,它告诉浏览器应该如何对待接收到的内容——是以附件形式保存还是在线查看。通常情况下会这样配置[^3]: ```java // 设定文件名编码方式以防乱码 String encodedFileName = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20"); // 添加 Content-Disposition header 来指示这是一个要被下载的文件,并指明其名称 res.addHeader("Content-Disposition", "attachment;filename=" + encodedFileName); ``` 这里需要注意几点: - 使用 URL 编码函数对文件名进行了转义处理,防止因为特殊字符而导致错误。 - 将空格替换成了 `%20` 而不是加号 (`+`) ,这是为了避免某些浏览器可能无法正确解析带有空格的名字。 - 参数 `"attachment"` 表达的意思是建议浏览器将此资源当作附件处理;如果希望直接显示则可改为 `"inline"`。 除了上述两个必要的头部外,还可以考虑加入其他有用的元数据,比如文件大小等,以便于前端应用提供更好的用户体验[^1]: ```java long fileSize = getFileSize(); // 获取实际文件尺寸 res.setContentLengthLong(fileSize); // 或者 setContentLength(int length),取决于API版本支持情况 ``` 最后一步就是打开输出流并将字节流传送给客户端了。下面是一个完整的例子展示如何组合这些部分以实现安全可靠的文件传输过程[^4]: ```java public void download(String filename, HttpServletResponse res, HttpServletRequest req) throws IOException { // ...省略获取文件路径逻辑... try (InputStream inputStream = new FileInputStream(filePath)) { String encodedFileName = URLEncoder.encode(filename, StandardCharsets.UTF_8).replace("+", "%20"); res.setContentType("application/octet-stream"); res.setHeader("Content-Disposition", "attachment;filename=\"" + encodedFileName + "\""); res.setContentLength((int)new File(filePath).length()); byte[] buffer = new byte[4096]; int bytesRead; OutputStream outStream = res.getOutputStream(); while ((bytesRead = inputStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } outStream.flush(); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值