Хранение буфера в RethinkDB

Я загружаю файл (multipart/form-data) в Koa и хочу сохранить его в RethinkDB.

Я анализирую это с co-busboy, что приводит к потоку.

Затем я преобразовываю поток в буфер, присоединяя к нему данные / конечные прослушиватели, собирая все буферы и объединяя их.

После этого я получаю свою запись в БД, помещаю буфер в правильное поле и сохраняю его.

Но я всегда получаю ошибку диапазона, поэтому обновление никогда не сохраняется.

Нужен ли созданному мной буферу какая-то дополнительная информация, чтобы RethinkDB мог его хранить?

1 ответ

Вам не нужна дополнительная информация для ее хранения. Возьмите пример с koajs https://github.com/koajs/examples/blob/master/multipart/app.js, используйте то, что вы описали, вот код, который работает для меня.

var os = require('os');
var path = require('path');
var koa = require('koa');
var fs = require('co-fs');
var parse = require('co-busboy');
var saveTo = require('save-to');
var app = module.exports = koa();
var r = require('rethinkdb')


r.connect()
  .then(function(conn) {
    app.use(function *(){
      // parse the multipart body
      var parts = parse(this, {
        autoFields: true // saves the fields to parts.field(s)
      });

      // create a temporary folder to store files
      var tmpdir = path.join(os.tmpdir(), uid());

      // make the temporary directory
      yield fs.mkdir(tmpdir);

      // list of all the files
      var files = [];
      var file;

      // yield each part as a stream
      var bufs = [];
      var part;
      while (part = yield parts) {
        // filename for this part
        files.push(file = path.join(tmpdir, part.filename));
        // save the file
        // yield saveTo(part, file);
        // We are saving into RethinkDB
        part.on('data', function(d){ bufs.push(d); });
        part.on('end', function(){
          var buf = Buffer.concat(bufs);

          r.table('user').insert({
            file: buf
          })
          .run(conn)
          .then(function(cursor) {
            console.log(cursor)
          })

        })
      }


      // return all the filenames as an array
      // after all the files have finished downloading
      this.body = files;

    })

})


if (!module.parent) app.listen(3000);

function uid() {
  return Math.random().toString(36).slice(2);
}

Затем отправка запроса:

curl -F "file=@./a.png" 127.0.0.1:3000

Новый документ должен быть вставлен с двоичными данными

Другие вопросы по тегам