说明
最近在网上荡了半天,想找到在Unity中接MinIO的示例,结果空空如也。按照官方文档,用VS创建【控制台应用(.NET Framework)】倒是可以在“play.min.io”上正常上传下载。但是将代码移植到Untiy项目中就不行了,没有命名空间的引用....
源码:MinIO_Unity: 在Unity项目中对MinIO操作
1、创建Untiy项目,将VS控制台应用代码微调到项目代码中,代码如下
using Minio;
using Minio.DataModel;
using Minio.DataModel.Args;
using Minio.DataModel.Encryption;
using Minio.Exceptions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;
public class Test : MonoBehaviour
{
private IMinioClient minio;
private Thread thread;
private string endpoint;
private string accessKey;
private string secretKey;
private string bucketName;
private string objectName;
private string filePath;
private string contentType;
private void Awake()
{
endpoint = "play.min.io";
accessKey = "见下面的步骤";
secretKey = "见下面的步骤";
bucketName = "blue1116";
objectName = "movie.mp4";
//objectName = "002.jpg";
filePath = "C:\\Users\\lsxk0\\Desktop\\movie.mp4";
//filePath = "C:\\Users\\lsxk0\\Desktop\\1.jpg";
//filePath = Application.persistentDataPath + "/IMG.jpg";
contentType = "application/jpg";
thread = new Thread(OnWork);
thread.Start();
}
private bool isUpload = false;
private void OnWork()
{
while (true)
{
if (minio != null)
{
if (isUpload)
{
isUpload = false;
Debug.Log($"准备执行上传");
FileUpload().Wait();
}
}
Thread.Sleep(1000);
}
}
private void InitMinio()
{
try
{
minio = new MinioClient()
.WithEndpoint(endpoint)
.WithCredentials(accessKey, secretKey)
.WithSSL() //没有搭https的话,把连接语句的 WithSSL() 去掉即可
.Build();
Debug.Log($"MinIO Init");
}
catch (Exception ex)
{
Debug.LogError($"SetObjectRun Error----{ex.Message}");
}
}
/// <summary>
/// 文件上传
/// </summary>
private async Task FileUpload()
{
try
{
// 在服务器上制作一个bucket(如果还没有)
var beArgs = new BucketExistsArgs().WithBucket(bucketName);
bool found = await minio.BucketExistsAsync(beArgs).ConfigureAwait(false);
if (!found)
{
var mbArgs = new MakeBucketArgs().WithBucket(bucketName);
await minio.MakeBucketAsync(mbArgs).ConfigureAwait(false);
}
// 将文件上传到bucket
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath)
.WithContentType(contentType);
await minio.PutObjectAsync(putObjectArgs).ConfigureAwait(false);
Debug.LogError("FileUpload Success:" + objectName);
}
catch (MinioException e)
{
Debug.LogError($"FileUpload Fail Error: {e.Message}");
}
}
/// <summary>
/// 将对象从bucket下载到本地文件
/// </summary>
public async Task GetObjectRun(
IMinioClient minio,
string bucketName = "my-bucket-name",
string objectName = "my-object-name",
string fileName = "local-filename",
IServerSideEncryption sse = null)
{
try
{
File.Delete(fileName);
var args = new GetObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFile(fileName)
.WithServerSideEncryption(sse);
_ = await minio.GetObjectAsync(args).ConfigureAwait(false);
Debug.LogError($"Downloaded the file {fileName} from bucket {bucketName}");
}
catch (Exception e)
{
Debug.LogError($"[Bucket] Exception: {e}");
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.U))
{
if (minio == null)
InitMinio();
isUpload = true;
}
}
private void OnDestroy()
{
thread.Abort();
}
}
1.1 使用 MinIO 的 Play 测试环境试用控制台
MinIO 控制台 — 适用于 Linux 的 MinIO 对象存储点击链接进入。复制UserName+Password。
MinIO Console点击进入控制台
1.2 accessKey+secretKey的获取
2、但是此时【using】都是灰色的,没有引用
3、【Unity请不要使用此方法】按照官方文档,此时应该注册Minio包,打开【VS】-【工具】-【NuGet包管理器】-【程序包管理器控制台】-输入【Install-Package Minio】---【结果如下】
3.1 结果:
4、使用第三方插件【成功上传,下载没测】
https://cloud.tencent.com/developer/article/2349012,感谢这位博主。
4.1 下载【第三方 NuGet 包管理器】
按照文章操作下载【第三方 NuGet 包管理器】。git地址如下https://github.com/GlitchEnzo/NuGetForUnity,打不开的可以直接下载:https://cloud.189.cn/t/A3aYNvNFnMvm (访问码:uet8)
4.2 导入完毕结构如下
4.3 通过第三方 NuGet 包管理器下载Minio。ps:如果没有出现【NuGet】,请把错误代码注释,我用的是6.0.0版本,其他版本没有测过(补充内容:前几天MinIO更新到6.0.1,都可以使用)
4.4 安装结果如下【请使用VS,VSCode依旧无引用】
此时就已经可以在Win10 Unity项目中进行测试