如何将图像二进制文件直接存储到 db(无 GridFS)

How store image binary directly to db (no GridFS)

如何将图像二进制文件直接上传到数据库?我读到只有较大的文件才需要 GridFS。

我的输入:

<template name="pixUpload">
    <input type="file" name="myFile" class="myPixInput">
</template>

和模板:

Template.pixUpload.events({
    'change .myPixInput': function(event, template) {
        event.preventDefault();
        var pixBinaryVar = event.target.myFile.value;
        MyPix.insert({
            binary: pixBinaryVar;
        })
    }
})

它不起作用,我收到一条错误消息,指出该值未定义。为什么?

对于小图像,您可以选择将图像更改为 base64 并将其存储在数据库中。

这可以通过创建 html canvas 并在其中绘制图像并获取 base64 图像来完成-

这是相同的参考 -

How to convert an image to base64 in JavaScript

Template.pixUpload.events({
    'change .myPixInput': function(event, template) {
        event.preventDefault();
        var file = event.target.files[0]; //assuming you have only 1 file
        var reader = new FileReader(); //create a reader according to HTML5 File API

        reader.onload = function(event){
          var result = reader.result //assign the result, if you console.log(result), you get {}
          var buffer = new Uint8Array(result) // convert to binary
          MyPix.insert({binary: buffer});
        }

        reader.readAsArrayBuffer(file); //read the file as arraybuffer
        //reader.readAsDataURL(file)

    }
})

从 Meteor 1.0 开始,当您在 Meteor.call 或 collection.insert 中发送 binary/buffer 时,它会从客户端转换为 EJSON,然后当它到达服务器时,它会被转换回到原来的binary/buffer

如果您打开 chrome 控制台并查看 websocket 流量,您会看到 EJSON 二进制字符串,它是 base64 编码的。所以另一种方法是使用 reader.readAsDataURL,这会将您的图像直接转换为 base64,从而避免 Meteor 再次执行此操作。

reader.onload = function(event){
  MyPix.insert({binary: reader.result});
}
reader.readAsDataURL(file);