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

时间:2015-11-25 00:49:33

标签: javascript angularjs node.js download docx

我一直在寻找stackoverflow的答案,但我没有成功。

我在路由中有一个node.js方法,它使用docxtemplater库从另一个模板生成.docx模板。

我从angularjs向我的/ api / generateReport发送了一些帖子和一些数据,我生成了这个.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);

角度控制器收到响应:



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)
    );
  }
);




1 个答案:

答案 0 :(得分: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);
});

如果您在代码

下使用快速使用
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); 
 });