如何在AngularJs控制器中从Node.js下载.docx文件

3
我在stackoverflow上寻找答案,但没有成功。
我有一个node.js方法在路由中,使用docxtemplater库从另一个模板生成.docx模板。
我向/api/generateReport发送一个来自angularjs的post请求,并生成这个.docx文件,但是我无法进行发送。将文件存放在/public目录中不可推荐也不安全,但如果我将文件放在/public目录中并提供文件路径给AngularJs,我无法下载它。
我已经阅读了关于blob和其他一些东西的内容,但我无法下载.docx文件。
PS:我正在使用$resource指令处理api请求,并将responseType设置为arrayBuffer

angular.module('MyApp')
  .factory('GenerateReport', function($http, $location,$resource, $rootScope, $alert, $window) {

       return $resource("/api/GenerateReport/:id",{}, {
            'query': {
                method: 'GET',
                isArray: false
            },
            responseType: 'arrayBuffer'
        });

  });

我会把响应发送这样。
 var fileDocx = fs.readFileSync(__base + "/plantillaSalida.docx", "binary");
 res.send(fileDocx);

在 Angular 控制器中接收到响应:

GenerateReport.save({
  projectExecution: $scope.projectExecution,
  auditingProject: $scope.auditingProject,
  participants: $scope.participants,
  exampleProjects: $scope.exampleProjects
  
  }, function(response) {

/***What to to here??***/

    $mdToast.show(
    $mdToast.simple()
    .content('Informe generado')
    .position('bottom right left')
    .hideDelay(3000)
    );
  },
  function(error) {
    console.log("error");
    $mdToast.show(
    $mdToast.simple()
    .content('Error al general el informe')
    .position('bottom right left')
    .hideDelay(3000)
    );
  }
);


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Binvention
1个回答

0
我建议在你的文件中添加下载标题,并使用超链接(<a href="/download">)进行链接。
var path = require('path');
var mime = require('mime');

app.get('/download', function(req, res){

  var file = __base + "/plantillaSalida.docx";

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);

  var filestream = fs.createReadStream(file);
  filestream.pipe(res);
});

如果您正在使用Express,请使用以下代码。
app.get('/download', function(req, res){
    var file = __base + "/plantillaSalida.docx";
    var filename = path.basename(file);
    res.setHeader('Content-disposition', 'attachment; filename=' + filename);
    res.download(file); 
 });

谢谢您的回复。但是我需要通过AngularJS控制器处理请求,因为我需要发布一些数据,所以不能直接使用href。 - José Gómez Checa
@JoséGómezCheca 在成功回调函数中添加<a>链接并触发<a>的点击事件。这只是一个想法。 - Subash Selvaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接