Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用knex插入水滴?_Postgresql_Express_Knex.js_Ng File Upload_Busboy - Fatal编程技术网

Postgresql 如何使用knex插入水滴?

Postgresql 如何使用knex插入水滴?,postgresql,express,knex.js,ng-file-upload,busboy,Postgresql,Express,Knex.js,Ng File Upload,Busboy,目前,我有一个上传系统使用ng文件上传到另一个服务器,这是工作良好的感谢CORS 为了管理我的数据库,我使用knex(migrationsandseed),我有一个带有bytea列的特定表 PostgreSQL数据库 为了使上传成为可能,我添加了busboy模块,以允许express管理多部分请求,并且文件被保存到磁盘上没有问题 但我真正想要的是把它保存在桌子上,放在bytea专栏里,而现在我在这方面运气不佳 欢迎提供任何指导和更好的文档。最好的方法是使用Amazon s3或其他服务存储blob

目前,我有一个上传系统使用ng文件上传到另一个服务器,这是工作良好的感谢CORS

为了管理我的数据库,我使用knex(migrationsandseed),我有一个带有bytea列的特定表

PostgreSQL数据库

为了使上传成为可能,我添加了busboy模块,以允许express管理多部分请求,并且文件被保存到磁盘上没有问题

但我真正想要的是把它保存在桌子上,放在bytea专栏里,而现在我在这方面运气不佳


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

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


如果您仍然想存储,可以使用sql驱动程序和bluebird。

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


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

经过很长一段时间我才弄明白

最后,使用angular+express+knex+postgres实现上传非常简单

首先,没有必要做勤杂工,相反,你需要

第二,调整它以组成一个合理的上传大小

第三,将帮助上传部分

如果有人需要,这里有几个片段:

上传按钮

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
enqueteservice.uploadanexo

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
在服务器端,快速路由器

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
作为参考,bodyParser设置在index.js

// ...
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文件上传主体将作为一个文件到达express router,您可以直接传递到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应用程序,它为我解决了这个问题。

经过很长时间的思考,我终于明白了

最后,使用angular+express+knex+postgres实现上传非常简单

首先,没有必要做勤杂工,相反,你需要

第二,调整它以组成一个合理的上传大小

第三,将帮助上传部分

如果有人需要,这里有几个片段:

上传按钮

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
enqueteservice.uploadanexo

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
在服务器端,快速路由器

<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>
$scope.sendarquivo = function (arquivo) {
  enqueteservice.uploadanexo(idenquete, arquivo).then(function () {
    $scope.list();
    $scope.arquivo = null;
  });
};
// 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);
  });
});
作为参考,bodyParser设置在index.js

// ...
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文件上传主体将作为一个文件到达express router,您可以直接传递到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应用程序,它为我解决了这个问题。

目前为止最好的方法似乎是使用一个特定的postgresql函数,如下所示:仍在寻找另一个选项,但是,保存到磁盘然后插入暂时有效现在为止,最好的方法似乎是使用一个特定的postgresql函数,如下所示:仍在寻找另一个选项,但保存到磁盘然后插入暂时有效“如何使用技术Y解决X”的最佳答案通常不是说“使用技术Z”是最好的答案“如何使用技术Y解决X”通常不是说“使用技术Z”