最近工作和前端对接一个下载的需求,遇到几个小问题,没有进度提示
第一部分:基础知识
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;
}
}
}