9

我正在考虑将data-urls 存储在我的 mongoDB 中,而不是存储对文件的引用或使用 GridFS。

资料网址:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAAEsCAYAAAB38aczAAAgAElEQV

我存储的所有文件都是 JPG 或 PNG,大小小于 1MB。

data-url我想知道这是否被认为是不好的做法,以及将s 1) 存储在单独的集合中 2) 作为集合中的元数据对读写操作有什么影响。

我对小文件存储的任何其他建议持开放态度。

4

2 回答 2

9

首先,我不会将 base64 编码数据存储在完全能够存储二进制数据的数据库中。那只是浪费空间。存储图像本身,而不是它的base64表示,即not data : "VBORw0KGgoAAAANSUhEUgAAA...",但是data : BinData("VBORw0KGgoAAAANSUhEUgAAA...")(前者是MongoDB的字符串,后者是二进制数据)。Base64 将大小增加了 33%。

除此之外,我认为这很好。权衡是获取所有数据的 1 个请求与多个请求。存储较大数据块的缺点是所有数据必须暂时在 RAM 中,但在 1MB 时这可能不是问题。

但是,您应该确保不要在不需要图像的情况下获取文档。1MB 并不算多,但对于阅读量大的集合来说,这是一场灾难。

于 2014-02-14T10:34:34.653 回答
0

我刚刚完成了一个解决方案。此解决方案适用于 Ajax,因此您可以使用fetchJavascript 中的调用。奇怪的是,在整个互联网上都找不到这个解决方案,这就是为什么我要帮助其他想要使用数据 uri 处理图像的人 :-)

型号

        cmsImage: { data: Buffer, contentType: String }

存储在 MongoDB 中:

        let rawData = fs.readFileSync(`${root}public/uploads/` + file.originalname);
        let base64Data = Buffer.from(rawData).toString('base64');

        // upload this image
        let image = { 
            cmsImage: {
                data: base64Data,
                contentType: file.mimetype
            }    
        };

        // in this record in the database
        await this.model.findByIdAndUpdate(body.id, image);        

从 MongoDB检索并动态创建图像元素:

       // decode image from database as image uri
       let imageArray = new Int8Array(image.data.data);
       let decodedImage = new TextDecoder().decode(imageArray);

       // image
       let cmsImage = document.createElement("img");
       cmsImage.src = "data:" + image.contentType + ";base64," + decodedImage;
       cmsImage.alt = "image";
       cmsContent.appendChild(cmsImage);

Multer - 使用 originalfile 上传到数据库。

      let storage = multer.diskStorage({
        destination: function (req, file, cb) {
          cb(null, './public/uploads')
        },
        filename: function (req, file, cb) {
          cb(null, file.originalname)
        }
      });

      this.upload = multer({ storage: storage });

上传到目录

      this.upload.single(uploadImage)

  
于 2021-09-02T13:17:59.447 回答