Javascript 通过angular下载文件

Javascript 通过angular下载文件,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,我正在尝试制作简单的文件服务器。我有Node.js后端和MongoDB GridFS存储来存储文件。我正在通过gridfs流从服务器获取文件。在前端,我使用的是角度。我有两个主要问题: 当我使用Blob提供下载服务时,文件名变为:“d1c393df-b0d9-4ae5-befe-8d45b183eb54…”。我读了很多关于它的文档,没有找到任何解决方案 当我只通过Express提供下载服务而不进行身份验证时,文件会正确加载。但我通过Angular发送身份验证信息,如果没有它们,应用程序将抛出错误

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

  • 当我使用Blob提供下载服务时,
    文件名变为:“d1c393df-b0d9-4ae5-befe-8d45b183eb54…”。我读了很多关于它的文档,没有找到任何解决方案
  • 当我只通过Express提供下载服务而不进行身份验证时,文件会正确加载。但我通过Angular发送身份验证信息,如果没有它们,应用程序将抛出错误。我可以在没有身份验证的情况下指定路由,但这会使我的应用程序不安全
  • 我希望你能帮助我:

  • 找到另一种方法下载任何格式的文件
  • 更改现有代码以使其正常工作
  • 我的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/'+filename
    url打开新窗口,浏览器将开始下载内容。您可以在服务器端控制内容类型和文件名。你们可以看一看例子:

    I
    m在没有角度的情况下为应用程序提供服务时使用这种技术。但当我实现它时,Express方法'res.redirect()'不起作用(浏览器不打开任何链接。我的数据丢失),你能提供一个例子吗?