背景:为了实现上传功能,搭建了自己的文件存储服务器。
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,
});