Хранение буфера в 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
Новый документ должен быть вставлен с двоичными данными