MinIO搭建自己的文件存储服务器

541 阅读2分钟

背景:为了实现上传功能,搭建了自己的文件存储服务器。 

Docker 部署 MinIO

docker run -p 9091:9000 -p 9090:9090 \
  --name "minio" \
  -d --restart=always \
  -e "MINIO_ACCESS_KEY=admin" \
  -e "MINIO_SECRET_KEY=123456" \
  quay.io/minio/minio server /data --console-address ":9090"

这是一个用于运行MinIO对象存储服务器的Docker命令。让我为您解析一下每个参数的含义:

  • -p 9091:9000 -p 9090:9090: 这个参数用于将容器内部的端口映射到主机上的端口。在这里,容器内部的9000端口将映射到主机上的9091端口,而9090端口将映射到主机上的9090端口。
  • --name "minio": 这个参数用于指定容器的名称,这里设置为"minio"。
  • -d --restart=always: 这个参数指定以守护进程模式运行容器,并且在容器退出时自动重启。
  • -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=123456": 这个参数用于设置MinIO访问账号和密码。
  • quay.io/minio/minio server /data: 这个参数指定要运行的MinIO镜像以及要存储数据的路径。在这里,使用的镜像是"quay.io/minio/minio",数据将存储在容器内的"/data"路径下。
  • --console-address ":9090": 这个参数指定MinIO控制台的地址。在这里,控制台将在容器内部的9090端口上监听。

通过运行这个Docker命令,您将在本地主机上以MinIO对象存储服务器的形式运行一个容器,并可以通过9091端口访问MinIO服务,以及通过9090端口访问MinIO控制台。

成功后,link

创建桶(buckets)

  • 创建桶
  • 创建可访问的令牌

访问资源

  • nextjs 13 写的接口 api/upload
import { NextRequest, NextResponse } from 'next/server';
import { minioClient } from '@/utils/minio';

const bucketName = process.env.MINIO_BUCKET_NAME;

export async function POST(request: NextRequest) {
  const data = await request.formData();
  const file: File | null = data.get('file') as unknown as File;
  const contentType = data.get('contentType') as string;

  if (!file) {
    return NextResponse.json({
      code: 4001,
      success: false,
    });
  }

  const bytes = await file.arrayBuffer();
  const buffer = Buffer.from(bytes);

  const fileName = `${Date.now()}_${data.get('fileName')}`;
  await minioClient.putObject(bucketName, fileName, buffer, {
    'Content-Type': contentType,
  });

  // 生成24小时有效的签名URL
  const presignedUrl = await minioClient.presignedGetObject(bucketName, fileName, 24 * 60 * 60);

  return NextResponse.json({
    code: 200,
    data: {
      url: presignedUrl,
      fileName,
      bucketName,
    },
    success: true,
  });
}
  • next13 客户端的 antd upload 自定义上传
const data = new FormData();
data.append('file', file);
data.append('fileName', file.name);
data.append('contentType', file.type);
const res = await fetch('/api/upload', {
method: 'POST',
body: data,
});
if (!res.ok) {
setLoading(false);
throw new Error(await res.text());
}
const lastData = await res.json();
onSuccess({
url: lastData?.data?.url,
});

体验一下

MinIO 文档