当前位置: 首页 > 知识库问答 >
问题:

通过angular下载文件

耿玄裳
2023-03-14

我试图使简单的文件服务器。我有Node.js后端与MongoDB GridFS存储存储文件。我从服务器获取文件通过gridfs-stream。在前端,我使用Angular。我有两个主要问题:

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

我希望你能帮助我:

  1. 找到另一种方法下载任何格式的文件

我的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");
      }
  });
};

共有1个答案

阎建中
2023-03-14

您不需要使用ajax来下载文件并在$window中打开它。打开(fileURL) 。您只需使用“/api/files/”文件名打开新窗口,浏览器就会开始下载内容。您可以在服务器端控制内容类型和文件名。您可以看一看示例:Nodejs响应发送文件

 类似资料:
  • 问题内容: 我有一个生成CSV文件并将其通过http / ajax get返回到页面的服务。我希望用户单击按钮,调用服务,然后将文件下载到用户的浏览器。 我想使用Angular Way,尽管我认识到这可能与Ajax或浏览器的关系要比Anguler本身更多。 该服务在C#中,它返回的内容是: 调用该服务的控制器代码如下所示。它有效,但是我不知道如何成功: 问题答案: 您无法从常规的ajax GET或

  • 问题内容: 我在服务器端有一个Struts2操作,用于文件下载。 但是,当我使用jQuery调用操作时: 在Firebug中,我看到数据是通过 Binary流 检索的。我想知道如何打开 文件下载窗口 ,用户可以用它在本地保存文件吗? 问题答案: 这是我现在建议的一些注意事项: 需要相对较新的浏览器 如果预期文件 很大,则 您可能应该执行与原始方法(iframe和cookie)类似的操作,因为以下某

  • 下面是Java样例代码 import java.io.IOException; import com.xiaomi.infra.galaxy.fds.client.FDSClientConfiguration; import com.xiaomi.infra.galaxy.fds.client.GalaxyFDS; import com.xiaomi.infra.galaxy.fds.clien

  • 有人成功地从linux终端下载了wetransfer链接吗? thnx mart

  • 问题内容: 我正在构建一个应用程序,以从后端服务器下载PDF文件。我写了以下代码: 在后端服务器上,方法如下: 我从我的适配器调用此rest方法为: 通话结束后,我从此服务获得以下响应: 如何解析此响应为PDF文件并将其显示给用户?当我使用以下代码从应用程序中简单地调用此适配器方法时,当我右键单击适配器并选择运行为“调用移动适配器”时,也会收到此响应: 我在浏览器的控制台上得到了相同的响应,但是正

  • 问题内容: 我有一个基于jquery的单页webapp。它通过AJAX调用与RESTful Web服务进行通信。 我正在尝试完成以下任务: 将包含JSON数据的POST提交到REST URL。 如果请求指定JSON响应,则返回JSON。 如果请求指定PDF / XLS / etc响应,则返回可下载的二进制文件。 我现在有1&2,并且客户端jquery应用通过基于JSON数据创建DOM元素在网页上显