mysql使用blob存储base64格式文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql使用blob存储base64格式文件相关的知识,希望对你有一定的参考价值。

参考技术A

1.MySQL有四种BLOB类型:
  ·tinyblob:仅255个字符
  ·blob:最大限制到65K字节
  ·mediumblob:限制到16M字节
  ·longblob:可达4GB
2.mybatis对应mysql blob的类型
byte[] imgbytes对应了mysql imgbytes blob类型

3.将base64转成二进制的byte数组。直接就可存储到mysql中

使用 Node Multer 缓冲区获取 Blob 并将 Blob 转换为 Base 64

【中文标题】使用 Node Multer 缓冲区获取 Blob 并将 Blob 转换为 Base 64【英文标题】:Get the Blob Using Node Multer Buffer And Convert Blob To Base 64 【发布时间】:2021-11-02 13:57:42 【问题描述】:

我正在尝试将 Uint8Contents 作为 Blob 转换为 base64 并将其存储为来自 ArrayBuffer/Buffer 的 PgSQL bytea,使用 Expressjs 的 multer 中间件。

大多数答案都是先将其保存在文件系统中,但是您将如何使用 multer 内存存储? (我是这样用的)

import  Router, Request, Response  from 'express'
import multer from 'multer'

const storage = multer.memoryStorage()
const upload = multer( storage: storage )
const api = Router()

api.post('/customer/:customer_id/photo', upload.single('photo'),
    async (req: Request, res: Response) => 

    const customerId = req.params.customer_id
    const photoBuffer = req?.file?.buffer as Buffer

    const arrayBuffer = photoBuffer.buffer.slice(
      photoBuffer.byteOffset,
      photoBuffer.byteOffset + photoBuffer.byteLength
    )

    const uInt8Contents = photoBuffer.readUInt8(photoBuffer.byteOffset)
    console.log("uInt8Contents",uInt8Contents)

    // const arrayBuffer = Uint8Array.from(photoBuffer).buffer
    // const photoBlob = Buffer.from(arrayBuffer).Blob([arrayBuffer])
    console.log("bufferPhoto", arrayBuffer)

    // TODO: Need a code for converting array buffer or buffer to be the correct image Blob

    const base64Photo = Buffer.from(arrayBuffer).toString('base64')
    // Store base 64 photo in PgSQL bytea
    // ...
  
)

我只是不知道如何将正确的 Blob 转换为 base64 并将其存储在 PgSQL 中为 bytea

所以,问题是:在倒数第二行,如何将文件转换为Blob

我得到了这个输出,但它似乎不是 blob 的 Uint8Contents,因为图像根本不显示。

ArrayBuffer 
  [Uint8Contents]: <ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e2 02 a0 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 02 90 6c 63 6d 73 04 30 00 00 6d 6e 74 72 52 47 42 20 58 59 5a 20 07 dd 00 0a 00 08 00 17 00 2b 00 36 61 63 73 70 41 50 50 4c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 2527 more bytes>,
  byteLength: 2627

【问题讨论】:

你是如何访问你的数据库的?使用续集? 我不认为它与数据库有任何关系,虽然......因为上传的文件是multipart/form-data,我们只需要将上传的二进制Blob转换为base64。为了回答您的问题,我们使用了一个名为 Objection 的 ORM。从 pgSQL DB 获取二进制 Blob base64 作为 bytea 已经开始工作了。 【参考方案1】:

我发现了这个问题: https://github.com/dherault/serverless-offline/issues/464

基本上是serverless-offline 问题:当服务器在serverless-offline 中运行并上传图像时,二进制图像会像这样失真:

二进制图像应如下所示:

简而言之,字符正在被serverless-offline 更改。但是,该链接表明,如果您要在 non-serverless-offline 环境中部署代码,它将起作用。

因此,此代码在部署后仍然可以工作:

import  Router, Request, Response  from 'express'
import multer from 'multer'

const storage = multer.memoryStorage()
const uploadPhoto = multer( storage: storage ).single('upload')
const api = Router()

v1Api.post('/user/:user_id/photo', uploadPhoto, async (req: Request, res: Response) => 
  const userId = req.params.user_id
  const photoBuffer = req?.file?.buffer as Buffer
  const binaryPhoto = Buffer.from(photoBuffer).toString('binary')
  const base64Photo = Buffer.from(binaryPhoto).toString('base64')
  console.log(base64photo) // Save this base64photo as bytea
)

否则,使用此插件aws-serverless-express-binary 配置serverless.yml 以支持二进制。

编辑

我们将它部署在一个环境中,它似乎可以正常工作。

【讨论】:

以上是关于mysql使用blob存储base64格式文件的主要内容,如果未能解决你的问题,请参考以下文章

uniapp 图片base64格式转blob格式方法

MySQL - Base64 与 BLOB

base64blob格式相互转换及应用

base64blob格式相互转换及应用

base64blob格式相互转换及应用

如何下载 Block Blob (Base64) 文件并使用 Azure Blob 存储将其转换为 PNG?