搭建一个文件存储服务器minio,实现文件存储

发布时间 2023-10-09 16:50:42作者: 今晚打老虎!

搭建一个文件存储服务器minio,实现文件存储

Minio是一个开源的、自托管的对象存储服务器,它提供了类似于云存储服务的功能。你可以使用Minio搭建自己的私有云存储解决方案,或者作为公共存储服务的替代方案。

安装

官网:https://min.io/download

根据官网内容进行安装即可。笔者采用windos
本地安装的方式

安装好后就能看到账号和密码了。默认的为 miniadmin 登录地址为:http://127.0.0.1:9001/

默认的管理控制台端口是9001
客户端的请求的端口是9000

PS> setx MINIO_ROOT_USER admin
PS> setx MINIO_ROOT_PASSWORD 123456
ps> minio.exe server D:\minio\Data --console-address ":9001"


知识点

  • Bucket(存储桶):Bucket 是 Minio 的最顶层命名空间,类似于文件系统中的文件夹。在 Minio 中,你可以创建多个 Bucket 来组织和管理对象。

  • Object(对象):Object 是 Minio 存储的实际数据单元。每个 Object 可以是任意大小的文件,通常由文件内容、元数据和一个唯一标识符(Object Key)组成。

  • Object Key(对象键):Object Key 是每个 Object 的唯一标识符,用于区分不同的 Object。它类似于文件系统中的文件路径,由目录结构和文件名称组成,例如 "photos/2021/image.jpg"

  • Presigned URL(预签名URL):Presigned URL 是一种带有临时访问权限的 URL,通过该 URL 可以让用户在一定时间内对特定的 Object 进行读取、写入、删除等操作。这对于授权临时访问非常有用,比如与其他用户共享文件或资源。

  • Access Key 和 Secret Key(访问密钥):Access Key 和 Secret Key 是用于身份验证的凭据。Access Key 用于标识用户或应用程序,而 Secret Key 则用于进行身份验证。这些凭据需要在使用 Minio 客户端或访问 Minio API 时进行配置。

  • Region(区域):Region 是用来表示存储桶(Bucket)在物理位置上的分布。Minio 支持将数据存储在不同的区域,以实现高可用性和数据冗余。

  • Encryption(加密):Minio 提供了对 Bucket 和 Object 的服务器端加密功能。可以使用客户端提供的加密选项,将数据在上传到 Minio 之前进行加密,以保证数据的机密性。

  • Endpoint 对象存储服务的URL

使用

最简单的办法参考Asp.Net Core 5.0/6.0对象储存扩展包,支持Minio自建对象储存、阿里云OSS、腾讯云COS、七牛云Kodo。支持OSS常规操作,比如储存桶创建,删除、对象上传、下载、生成签名URL等。支持.NET 5/6,也推荐升级至.NET 5/6.

DotNet官方示例

  
using System;
using Minio;
using Minio.Exceptions;
using Minio.DataModel;
using System.Threading.Tasks;
using System.Runtime.Intrinsics.X86;
using System.Reactive.Linq;

namespace FileUploader
{
    class FileUpload
    {
        static void Main(string[] args)
        {
            //var endpoint = "play.min.io";
            //var accessKey = "Q3AM3UQ867SPQQA43P2F";
            //var secretKey = "zuf+123123";
            var accessKey = "Si27eMmz123123B1zf96rmyezz";
            var secretKey = "123123";
            var endpoint = "421231231238";
            try
            {
                var minio = new MinioClient() 
                                    .WithEndpoint(endpoint,9000)
                                    .WithCredentials(accessKey, secretKey)
                                    //.WithSSL()
                                    .Build();
                FileUpload.Run(minio).Wait();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }

        // File uploader task.
        private async static Task Run(MinioClient minio)
        {   
            var bucketName = "filebacket";
            var objectName = "Surface_Laptop_Go_003.png";
            var filePath = @"C:\Users\Pride\Pictures\Surface_Laptop_Go_003.png";
            try
            {
                // 在服务器上创建一个bucket(如果还没有)。
                var beArgs = new BucketExistsArgs()
                    .WithBucket(bucketName);
                //是否存在bucket
                bool found = await minio.BucketExistsAsync(beArgs).ConfigureAwait(false);
                if (!found)
                {
                    var mbArgs = new MakeBucketArgs()
                        .WithBucket(bucketName);
                    await minio.MakeBucketAsync(mbArgs).ConfigureAwait(false);
                }

                //获取bucket列表
                var getListBucketsTask = await minio.ListBucketsAsync().ConfigureAwait(false);

                // 输出bucket列表
                foreach (var bucket in getListBucketsTask.Buckets)
                {
                    Console.WriteLine(bucket.Name + " " + bucket.CreationDateDateTime);
                }

                //上传文件到bucket。
                //var putObjectArgs = new PutObjectArgs()
                //    .WithBucket(bucketName)
                //    .WithObject(objectName)
                //    .WithFileName(filePath);
                //    //.WithContentType(contentType);
                //var res= await minio.PutObjectAsync(putObjectArgs).ConfigureAwait(false);

                var listObjectsArgs = new ListObjectsArgs()
                    .WithBucket(bucketName);

                //获取bucket里面所有文件
                var filelist = await minio.ListObjectsAsync(listObjectsArgs);
           


                var expiryInSeconds = 7 * 24 * 60 * 60;  // 链接有效期(7天的秒数)
                //获取临时预览链接
                var args = new PresignedGetObjectArgs()
               .WithBucket(bucketName)
               .WithObject(objectName)
               .WithExpiry(expiryInSeconds);
                var aaa = await minio.PresignedGetObjectAsync(args).ConfigureAwait(false);
                Console.WriteLine($"文件临时预览链接: {bucketName}");

                
                //var bbb = await minio.GetObjectAsync(args).ConfigureAwait(false);
                


                //var bucketName = "your-bucket-name";  // 存储桶名称
                //var objectName = "your-object-name";  // 文件名称
                //var expiryInSeconds = 3600;  // 链接有效期(单位:秒)

                //var presignedUrl = await _minioClient.PresignedGetObjectAsync(bucketName, objectName, expiryInSeconds);
                //Console.WriteLine("浏览链接: " + presignedUrl);


                Console.WriteLine("Successfully uploaded " + objectName);
            }
            catch (MinioException e)
            {
                Console.WriteLine("File Upload Error: {0}", e.Message);
            }
        }
    }
}

上传成功

直接访问就是失败

参考

docker操作

dOgrpaNx2ayj1iDUHMLq7T2hmj5w7MV44Zh9UNap

run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

-- 前面为本地路径 /网络路径
docker run -p 9000:9000 -p 9001:9001 -v /docker/minio/data:/data minio/minio server /data --console-address ":9001"

minioadmin

更改密码