文件未下载express.js res.download

时间:2016-03-08 03:58:47

标签: javascript node.js excel express mean-stack

我使用xlsx npm模块生成/导出了json2xlsx文件,并下载了我正在使用res.download(file) express.js功能的文件。

参考:Download a file from NodeJS Server using Express

以下是我的代码:

var fs = require("fs");
var json2xls = require('json2xls');

app.use(json2xls.middleware);

app.get('/export/:id', function (req, res) {
    var id = req.params.id;
    db.collection('provider').findOne({_id: mongojs.ObjectId(id)}, function (err, doc) {
        var jsonArr = {};
        var arr = jsonArr = doc;
        var xls = json2xls(arr);
        fs.writeFileSync('data.xlsx', xls, 'binary'); //file exported

        //Now I want to download that file
        res.setHeader('Content-disposition', 'attachment; filename=data.xlsx');
        res.setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        res.download(__dirname + '/public/data.xlsx', function (error) {
          console.log(error);
        });

        //res.json(doc);
    });
});

查看HTML

        <div class="panel-body">

            <div class="form-group" ng-repeat="(key,value) in providerList"  ng-if="!$first">                    
                    <label>{{key.replace("_", " ") | uppercase}}</label>
                    <input type="text" class="form-control" id="title" placeholder="Enter Title" ng-model="providerList[key]">                    
            </div>

            <div class="well well-lg text-center bg-gray">                                        
                <button class="btn-lg btn-success" ng-click="export(id)">Export to Spreadsheet</button>
            </div>
        </div>

AngularJS控制器代码:

$scope.export = function (id) {
            $http.put('/export/' + id, $scope.providerList).success(function (response) {
                 if (response) {
                    alert("File is successfully exported at: "+ response);
                }
            });
        };

错误:{ [Error: Request aborted] code: 'ECONNABORTED' }

更新错误

enter image description here

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:4)

res.download()之前设置响应标头,

res.setHeader('Content-disposition', 'attachment; filename=data.xlsx');
res.setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.download(__dirname + '/data.xlsx');

<强> 更新:

根据see picture 3, 你可以使用res.xls('data.xlsx', jsonArr);

为此你必须为json2xls设置中间件

app.use(json2xls.middleware);

更新2:

对于前端(AngularJS),请参阅json2xls

答案 1 :(得分:1)

可能是您的.xlsx文件保存在根文件夹中。因此,将.xlsx文件移动到 public 文件夹下,并在下面的快递中启用它。

 function SendForm() {
   var formData = new FormData();
   formData.append('value1', 'hello');
   formData.append('value2', 'world');
   $.ajax({
     url: "http://server/controller/SomeAction",
     type: 'post',
      cache: false,
      contentType: false,
      processData: false,
      data: formData,
      success: function (data) {
        // ..... any success code you want
    }
   });

答案 2 :(得分:0)

我注意到您的角度控制器制作了$http.put,但是您的后端期望得到GET(app.get)。您确定这是您打算配置的方式吗?