http请求,关于下载的相关请求头,你真的的完全懂了吗?

最近工作和前端对接一个下载的需求,遇到几个小问题,没有进度提示

第一部分:基础知识

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

1.0

两种主要的 MIME 类型在默认类型中扮演了重要的角色:

  • text/plain 表示文本文件的默认值。一个文本文件应当是人类可读的,并且不包含二进制数据。
  • application/octet-stream 表示所有其他情况的默认值。一种未知的文件类型应当使用此类型。浏览器在处理这些文件时会特别小心, 试图防止、避免用户的危险行为.

IANA 是 MIME 媒体类型的官方注册机构,并维护了 list of all the official MIME types。下面的表格列出了 Web 上的一些重要 MIME 类型:

因为返回给前端的是二进制oclet,可能是任何文件,因此采用这种方式,

2.0

在 HTTP 场景中,第一个参数或者是 inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 filename 的值预填为下载后的文件名,假如它存在的话)。

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition

3.0

请求头  Access-Control-Request-Headers 出现于 preflight request (预检请求)中,用于通知服务器在真正的请求中会采用哪些请求头。

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Request-Headers

备注:oclet和byte区别

在不严谨的前提下,byte和octet都表示为8 bits,但是严格意义上来讲,octet才是严格意义上的8 bits,而历史上的byte其实可以表示为4 bits ~ 10 bits,只不过现在的计算机环境下,已经默认了byte为8 bits。

octet = 8 bits
byte = (4~10 bits)8 bits(通常情况下)
参考出处:https://www.differencebetween.com/difference-between-octet-and-vs-byte/
 

第二部分:相关代码

http://tianfeng.cc/Article/6849

byte[] buffer = new byte[s_size];
            using( Stream iStream = DocBLL.DownloadFileStream(path) ) {
                long contentLength = iStream.Length;
                long hasRead = 0;
                using( Response.Body ) {
                    Response.ContentType = "application/octet-stream";
                    Response.ContentLength = contentLength;
                    Response.Headers["Content-Disposition"] = "attachment; filename=" + HttpUtility.UrlEncode(Path.GetFileName(path));
                    while( hasRead < contentLength ) {
                        if( HttpContext.RequestAborted.IsCancellationRequested )
                            break;
                        int currentRead = iStream.Read(buffer, 0, Convert.ToInt32(s_size));
                        Response.Body.Write(buffer, 0, currentRead);
                        Response.Body.Flush();
                        hasRead += currentRead;
                    }
                }
            }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值