Response.AddHeader实现下载

本文介绍了一种使用ASP.NET中的Response.AddHeader方法来实现文件下载的技术。具体包括设置响应头以允许浏览器将请求的内容解释为文件下载,并提供了一个示例函数DownFile,该函数接收文件路径和文件名作为参数并触发下载过程。特别地,文章强调了对于中文文件名进行正确编码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    /// <summary>
    
/// Response.AddHeader实现下载
    
/// </summary>
    
/// <param name="filePath">完整的文件路径</param>
    
/// <param name="fileName">文件名</param>
    private void DownFile(string filePath, string fileName)
     {
         FileInfo fileInfo
= new FileInfo(filePath);
         Response.Clear();
         Response.ClearContent();
         Response.ClearHeaders();
         Response.AddHeader(
"Content-Disposition", "attachment;filename=" + fileName);
         Response.AddHeader(
"Content-Length", fileInfo.Length.ToString());
         Response.AddHeader(
"Content-Transfer-Encoding", "binary");
         Response.ContentType
= "application/octet-stream";
         Response.ContentEncoding
= System.Text.Encoding.GetEncoding("gb2312");
         Response.WriteFile(fileInfo.FullName);
         Response.Flush();
         Response.End();
     }

注意下载中文名称文件时必须进行编码.

### 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
发出的红包

打赏作者

zzcbyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值