javascript – 通过angular下载文件

我正在尝试制作简单的文件服务器.我有Node.js后端和MongoDB GridFS存储来存储文件.我是通过gridfs-stream从服务器获取文件的.在前端我使用Angular.我有两个主要问题:

>当我使用Blob提供下载时,文件名变为:“d1c393df-b0d9-4ae5-befe-8d45b183eb54 ……”.我阅读了很多关于它的文档,并没有找到任何解决方案.
>当我只通过Express进行下载而不进行身份验证时,文件会正确加载.但我通过Angular发送auth信息,没有它们应用程序将抛出错误.我可以指定路由而无需身份验证,但这使我的应用程序不安全.

我希望你能帮助我:

>找到另一种下载任何格式文件方法.
>更改我现有的代码以使事情正常工作

我的Angular Service通过构造Blob来获取文件

getFilesFactory.download = function(filename){
  $http.get('/api/files/' + filename,{responseType:'arraybuffer'})
  .then(function(data){
    var stringCT = data.headers('Content-Type').toString();
    console.log(stringCT);
    var contentType = stringCT.substring(1,stringCT.length - 1);
    console.log(contentType);

      switch (contentType) {
        case "image/jpeg":
          file = new Blob([data.data],{type: 'image/jpeg'});
          fileURL = URL.createObjectURL(file);
          $window.open(fileURL);
        break;
        case "application/pdf":
          file = new Blob([data.data],{type: 'application/pdf'});
          fileURL = URL.createObjectURL(file);
          $window.open(fileURL);
        break;
        case "application/msword":
          file = new Blob([data.data],{type: 'application/msword'});
          fileURL = URL.createObjectURL(file);
          $window.open(fileURL);
        break;
        case "application/octet-stream":
          file = new Blob([data.data],{type: 'application/octet-stream'});
          fileURL = URL.createObjectURL(file);
          $window.open(fileURL);
        break;
        default: console.log("no contentType match");
      }
  });
};

解决方法

您不需要使用ajax下载文件并使用$window.open(fileURL);打开它.您可以使用’/ api / files /’文件名网址打开新窗口,浏览器将开始下载内容.您可以在服务器端控制Content-Type和文件名.您可以查看示例: Nodejs send file in response

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...