如何使用knex插入blob?

时间:2015-09-27 04:59:14

标签: postgresql express knex.js ng-file-upload busboy

目前我有一个使用ng-file-upload到另一台服务器的上传系统,由于CORS,它运行良好。

要管理我的数据库,我使用knex(迁移和种子),我有一个带有bytea列的特定表。

postgresql数据库。

为了使上传成为可能,我添加了busboy模块以允许快递管理多部分请求,并且文件正在保存到磁盘而没有任何问题。

但我真正想要的是将它保存在表格中,在bytea列中,现在我在这样的任务中没有运气。

欢迎任何指导和更好的文档。

2 个答案:

答案 0 :(得分:1)

很长一段时间后我都明白了。

最后,使用angular + express + knex + postgres

进行上传工作非常简单

首先,没有必要使用busboy,相反,您需要bodyParser's raw mode

第二,调整它以符合合理的上传大小。

第三,ng-file-upload将有助于上传部分。

如果有人需要它,可以在这里找几个片段:

上传按钮

<div layout="row" layout-align="center center">
  <md-button ngf-select ng-model="arquivo" class="md-raised md-primary">Selecionar arquivo</md-button>
  <md-button ng-show="arquivo" ng-click="arquivo = null" class="md-raised md-warn">Cancelar</md-button>
  <md-button ng-show="arquivo" ng-click="sendarquivo(arquivo)" class="md-raised md-primary" ng-disabled="arquivo.size > 4096 * 1024">Enviar arquivo</md-button>
</div>

<强> controller.sendarquivo

$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};

<强> enqueteservice.uploadanexo

// serviço de enquete
angular.module("roundabout").factory("enqueteservice", function($http, Upload) {
  return {
    uploadanexo: function(idenquete, file) {
      return Upload.http({
        url: "/enquete/" + idenquete + "/uploadanexo/" + file.name,
        method: 'POST',
        headers: {
          'Content-Type': 'application/octet-stream' // file.type //  
        },
        data: file
      });
    }
  }
});

在服务器端,快递路由器

router.post("/:idenquete/uploadanexo/:descricaoanexoenquete", function (req, res) {
  knex("anexoenquete").insert({
    idenquete: req.params.idenquete,
    descricaoanexoenquete: req.params.descricaoanexoenquete,
    dadoanexoenquete: req.body
  }, "idanexoenquete").then(function (ret) {
    res.send("idanexoenquete:" + ret[0]);
  }).catch(function (err) {
    res.status(500).send(err);
    console.log(err);
  });
});

供参考,index.js的bodyParser设置

// ...
app.use(bodyParser.json({limit: 1024 * 1024}));// 1MB of json is a lot of json
// parse some custom thing into a Buffer
app.use(bodyParser.raw({limit: 10240 * 1024, type: 'application/octet-stream'})); // 10 MB of attachments

使用此设置,ng-file-upload正文将作为Buffer到达快递路由器,您可以直接传递给knex insert语句。

下载二进制内容也可以轻松解决如下:

下载附件

router.get("/downloadanexo/:idanexoenquete", function (req, res) {
  knex("anexoenquete").select().where({
    idanexoenquete: req.params.idanexoenquete
  }).then(function (ret) {
    if (!ret.length)
      res.status(404).send("NOT FOUND");
    else {
      var anexoenquete = ret[0];
      res.setHeader("Content-disposition", "attachment;filename=" + anexoenquete.descricaoanexoenquete);
      res.send(anexoenquete.dadoanexoenquete);
    }
  }).catch(function (err) {
    res.status(500).send(err);
    console.log(err);
  });
});

希望此参考可以帮助将来的其他人,我能够关闭一个简单的Java应用程序,它正在为我解决这个问题。

答案 1 :(得分:0)

最好的方法是使用Amazon s3或其他服务存储blob,同时在sql中存储元数据。

如果你想要存储,你可以使用sql驱动程序和bluebird。