编程技术文章分享与教程

网站首页 > 技术文章 正文

MySQL的BLOB类型--小型文件系统 mysql中blob

hmc789 2024-11-13 11:28:20 技术文章 1 ℃

之前有个项目里需要用到文件系统来存储文件,由于是小型项目,也没有大文件要存,接个文件系统(比如阿里的OSS)不划算,就直接用MySQL来存了。

具体来说,MySQL有一个数据类型叫BLOB,可以存放类似于“文件二进制数据”的东西。文档、PDF、压缩包、excel等等都能支持,LongBlob的话最多可以存4G,当然实际不建议放大文件,毕竟要考虑效率问题。

用下来发现在这种小型需求里,或者是临时性的demo,BLOB使用简单方便,真的很香。

数据结构如下

当然了,用Navicat这样的工具是没法预览的,只能看到文件大小,如下

下面看看在前端如何存储及解析数据(示例为TypeScript语言)。

项目用到了Prisma,定义数据类型时使用Bytes就可以,如下

model File {
  id       String @id @default(uuid())
  fileName String @map("file_name")
  url      String
  content  Bytes
}

如果我们需要的数据是请求服务端接口获取的,我们可以使用如下所示的方式来接收

const response = await axios.postForm(
  `${process.env.SERVICE_URL}/file`,
  param,
  {
    responseType: "arraybuffer",
  }
);
const responseBuffer = response.data as Buffer;

然后封装成Buffer数据,存入数据库

content: {
  type: "Buffer",
  data: responseBuffer as any,
} as any

取的时候(一般是下载),我们可以像下面这样做

const fileReader = new FileReader();
fileReader.readAsDataURL(new Blob([Buffer.from(content)]));
fileReader.onloadend = () => {
  let a = document.createElement("a");
  a.download = fileName;
  a.style.display = "none";
  // 生成的base64编码
  let url = fileReader.result;
  a.href = url as string;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
};

关键是这一句new Blob([Buffer.from(content)]),就可以将数据解析出来啦。

是不是简单方便呢,如果有这样的需求,不妨考虑一下!

Tags:

标签列表
最新留言