微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐