2

現在、ng-file-upload を使用して別のサーバーにアップロードするシステムがありますが、これは CORS のおかげでうまく機能しています。

データベースを管理するために knex (移行とシード) を使用し、bytea 列を持つ特定のテーブルを用意しています。

PostgreSQL データベース。

アップロードを可能にするために、busboy モジュールを追加して Express がマルチパート リクエストを管理できるようにしました。ファイルは問題なくディスクに保存されています。

しかし、私が本当に望んでいるのは、それを表の bytea 列に保存することであり、今のところ、そのようなクエストには運がありません。

ガイダンスとより良いドキュメントを歓迎します。

4

2 に答える 2

3

しばらくして、私はそれを理解しました。

最後に、angular+express+knex+postgres でアップロードを機能させるのは非常に簡単です。

まず第一に、busboy は必要ありません。代わりに、bodyParser の raw モードが必要です。

次に、妥当なアップロード サイズになるように調整します。

3 番目に、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 本体は Express Router に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 アプリをシャットダウンすることができました。

于 2016-08-17T03:45:07.897 に答える
-5

最良の方法は、SQL にメタデータを保存しながら、Amazon s3 またはその他のサービスを使用して BLOB を保存することです。

とにかく保存したい場合は、sql driver と bluebird を使用できます。

于 2015-09-28T20:59:34.630 に答える