最近在做一个下载文件的功能,后台接口给的是二进制流的方式,那么前端要把二进制流下载下来。

这个过程使用$http的get请求,使用Blob接收,倒是没有难度,主要是遇到了,后台的文件名拿不到 的问题。

在浏览器 中是可以看到的这个请求头,就是js获取不到,如下图:

js中,使用response.headers(),只能获取到content-type,而获取不到content-disposition.

获取头信息的方法:

response.headers("Content-Disposition")

解决方法:

后台接口中,在响应头中增加:

  context.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

具体实现方式靠后台人员,增加了这个之后,前端使用js就能获取到了。

现贴出前端代码:

            $http({
url: url,
method: "GET",
params: data,
responseType: "blob" }).then(function (response, status, header, config, statusText) {
var fileName = response.headers("Content-Disposition").split(";")[].split("filename=")[];
var blob = response.data;
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function (e) {
// 创建一个a标签用于下载
var a = document.createElement('a');
a.download = fileName;
a.href = e.target.result;
$("body").append(a);
a.click();
$(a).remove();
} });

问题补充:

在使用过程中,发现,如果是中文文件名,则会存在乱码问题,解决这一问题:
  在response header 中,filename* 会是unicode字符串编码后的文件名,
  所以在前端从response header中获取文件名时,同时获取filename*的值,
  如果存在,则优先使用filename* ,
  并使用decodeURIComponent 对其进行解码。即可显示正确的中文文件名

将获取文件名处做如下修改:

                var fileName = response.headers("Content-Disposition").split(";")[].split("filename=")[];
var fileNameUnicode = response.headers("Content-Disposition").split("filename*=")[];
if (fileNameUnicode) {//当存在 filename* 时,取filename* 并进行解码(为了解决中文乱码问题)
fileName = decodeURIComponent(fileNameUnicode.split("''")[]);
}

 问题补充2:

 

在IE浏览器,下载无反应,因为IE浏览器不支持a标签的download属性,翻看以下w3cshool,如下:

果然啊,所以,改使用msSaveOrOpenBlob来下载文件,代码要做一些修改:

                if ('msSaveOrOpenBlob' in navigator) {//IE导出
window.navigator.msSaveOrOpenBlob(blob, fileName);
}

最终完整代码:

 $http({
url: url,
method: "GET",
params: data,
responseType: "blob" }).then(function (response, status, header, config, statusText) {
var fileName = response.headers("Content-Disposition").split(";")[].split("filename=")[];
var fileNameUnicode = response.headers("Content-Disposition").split("filename*=")[];
if (fileNameUnicode) {//当存在 filename* 时,取filename* 并进行解码(为了解决中文乱码问题)
fileName = decodeURIComponent(fileNameUnicode.split("''")[]);
} var blob = response.data;
if ('msSaveOrOpenBlob' in navigator) {//IE导出
window.navigator.msSaveOrOpenBlob(blob, fileName);
}
else {
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
reader.onload = function (e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement('a');
a.download = fileName;
a.href = e.target.result;
$("body").append(a);
a.click();
$(a).remove();
}
} });

angularjs 文件下载 并 从response header中获取文件名的更多相关文章

  1. Wildfly8 更改response header中的Server参数

    项目经过局方安全检查需要屏蔽掉服务器中间件信息,查了一下午,网上看到的都是修改jboss7的,我们使用的wildfly8(jboss改名为wildfly),修改地方不一样,折磨了半天. jboss服务 ...

  2. JBoss 7 更改response header中的Server参数

    jboss服务器缺省情况下会在HTTP response header中显示自身的标识,如下 Server: Apache-Coyote/1.1 出于安全考虑,如果不想让人知道服务器类型,可以用以下方 ...

  3. 【应用服务 App Service】如何移除App Service Response Header中包含的服务器敏感信息

    问题描述 有些情况下,当应用部署到App Service上后,在有些Response Header中,可以看见关于服务器的一些信息,这样会导致隐藏的安全问题,所以可以在web.config中移除某些关 ...

  4. Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比

    Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法   os.system('ll /data/')   但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...

  5. python和C语言从路径中获取文件名

    1.Python import os file_name = os.path.basename(filepath)#带后缀的文件名(不含路径) file_name_NoExtension = os.p ...

  6. 从response.header中提取cookie,在request里添加cookie

    //        List<String> resp = new ArrayList<String>();  //        HeaderIterator headers ...

  7. 从一个带有http://网络文件中获取文件名

    例如文件网址为: http://a.hiphotos.baidu.com/image/h%3D200/sign=c3da85e50123dd543e73a068e108b3df/80cb39dbb6f ...

  8. PHP 中获取文件名及路径

    1. basename("/mnt/img/image01.jpg")函数:得到文件名;输出结果为:image01.jpg. 使用 basename($uriString) 我们可 ...

  9. 3种Java从文件路径中获取文件名的方法

    package test; import java.io.File; public class FileName { /** * @param args */ public static void m ...

随机推荐

  1. JAVA中Stringbuffer的append( )方法

    Stringbuffer是动态字符串数组,append( )是往动态字符串数组添加,跟“xxxx”+“yyyy”相当‘+’号. 跟String不同的是Stringbuffer是放一起的,String1 ...

  2. javascript如何动态修改iframe的src

    为什么需要动态修改iframe的src?一般情况我们使用iframe,其中的src通常是写死的,但是有些时候我们不希望它是死的src,而是一个活的src. 示例代码如下: <!DOCTYPE h ...

  3. Zookeeper运维常用四字命令

    Zookeeper运维常用四字命令 echo stat|nc 127.0.0.1 2181 查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2 ...

  4. Git push origin dev-rgq-istokenstatus 【dev-rgq-istokenstatus -> dev-rgq-istokenstatus】

    RenGuoQiang@PC-RENGUOQIANG MINGW64 /d/zgg/zgg-crm (dev-rgq-istokenstatus) $ git push origin dev-rgq- ...

  5. git clone速度太慢的解决办法(亲测还有效)

    https://www.linuxidc.com/Linux/2019-05/158461.htm 1.查找域名对应的ip地址,并修改hosts文件 linuxidc@linuxidc:~/linux ...

  6. Python分词工具——pyhanlp

    本文为本人学习pyhanlp的笔记,大多知识点来源于GitHubhttps://github.com/hankcs/HanLP/blob/master/README.md,文中的demo代码来源于该G ...

  7. python路径相关技巧

    在文件C:\work\python\rqalpha\rqalpha\utils\config.py 找文件:C:\work\python\rqalpha\rqalpha\config.yml 则通过下 ...

  8. Excel如何输入负数

    一般红字发票很少开,以前都是单独把红字发票摘出来放到一行里,然后加减一下,前段时间有个客户因为普票无法报销,改要了专票,因为是电子发票,无法作废,开了张红字.虽然红字很少开,但是想着百度一下如何在ex ...

  9. [图片问答]LODOP打印的行间距字间距

    LODOP可以打印纯文本,也可以是超文本,关于哪些打印项是纯文本,哪些打印项是超文本,之前有博文相关介绍:LODOP中的纯文本和超文本打印项. 之前的关于纯文本的行间距字间距介绍:Lodop设置文本项 ...

  10. C# .NET 支付宝IOT小程序AES密钥解密

    实际测试 KEY 是 16个 byte,byte[] byteKEY = System.Convert.FromBase64String(key);     注意:是Convert.FromBase6 ...