当前位置: 首页 > news >正文

MinIO (五) .net core实现分片上传

开发环境

Win11

vs2022

appsettings.json添加配置项

  //minIO配置"MinIO": {//服务器IP"Endpoint": "192.168.xx.xx:9090",//账号"AccessKey": "3xR7i4zs1vLnxxxxxxxx",//密码"SecretKey": "P6bAnyzJm47Ub4WsIaz3TB4MCxbF5Bk2xxxxxxxx",//默认存储桶"Bucket": "demo",//保存文件的根目录"BucketDirectory": "c:\\aaa\\bbb\\ccc",//服务的URL地址"ServiceURL": "http://192.168.xx.xx:9090" //不可以用localhost,要用IP,比服务器IP多了一个http前缀}

注入代码

[ApiController]
[Route("api/[controller]/[action]")]
//[Authorize]
public class MinIOController : ControllerBase
{private static string _bucketName = string.Empty;//默认桶private static string _accessKey = string.Empty;private static string _secretKey = string.Empty;private readonly MinioClient _client;private readonly IConfiguration _configuration;private readonly IHttpClientFactory _httpClient;public MinIOController(MinioClient client,IConfiguration configuration,IHttpClientFactory httpClient){_client = client;_configuration = configuration;_accessKey = configuration["MinIO:AccessKey"];_secretKey = configuration["MinIO:SecretKey"];_bucketName = configuration["MinIO:Bucket"];_httpClient = httpClient;}//。。。。。。}

接下来是后端进行分片上传的代码示例,有两个,第一个是从官方考下来的代码示例,第二个是自己整理后的代码示例。

从官方考下来的代码示例

#region 后端进行分片上传示例(从官方文档上考下来的)
/// <summary>
/// 后端进行分片上传示例(从官方文档上考下来的)
/// </summary>
/// <param name="formFile">文件流</param>
/// <returns></returns>
[HttpPost]
public virtual async Task<IActionResult> UploadPartAsync(IFormFile formFile)
{AmazonS3Config config = new AmazonS3Config(){ServiceURL = _configuration["MinIO:ServiceURL"]  //"http://192.168.50.36:9090/",//ServiceURL = "https://folder.s3.amazonaws.com/",//RegionEndpoint = Amazon.RegionEndpoint.CNNorth1};int MB = (int)Math.Pow(2, 20);  //以兆(M)为单位// Create a clientusing AmazonS3Client amazonS3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);// Define input streamStream inputStream = formFile.OpenReadStream(); //Create13MBDataStream();// Initiate multipart uploadInitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest{BucketName = "test",Key = "Item1"};//InitiateMultipartUploadResponse initResponse = client.InitiateMultipartUpload(initRequest);InitiateMultipartUploadResponse initResponse = await amazonS3Client.InitiateMultipartUploadAsync(initRequest);GetPreSignedUrlRequest urlRequest = new GetPreSignedUrlRequest(){BucketName = "test",Key = "Item1",PartNumber = 1,Expires = DateTime.Now.AddMinutes(1)};// Upload part 1UploadPartRequest uploadRequest = new UploadPartRequest{BucketName = "test",Key = "Item1",UploadId = initResponse.UploadId,PartNumber = 1,PartSize = 6 * MB,InputStream = inputStream};UploadPartResponse up1Response = await amazonS3Client.UploadPartAsync(uploadRequest);// Upload part 2uploadRequest = new UploadPartRequest{BucketName = "test",Key = "Item1",UploadId = initResponse.UploadId,PartNumber = 2,PartSize = 6 * MB,InputStream = inputStream};UploadPartResponse up2Response = await amazonS3Client.UploadPartAsync(uploadRequest);// Upload part 3uploadRequest = new UploadPartRequest{BucketName = "test",Key = "Item1",UploadId = initResponse.UploadId,PartNumber = 3,InputStream = inputStream};UploadPartResponse up3Response = await amazonS3Client.UploadPartAsync(uploadRequest);// List parts for current uploadListPartsRequest listPartRequest = new ListPartsRequest{BucketName = "test",Key = "Item1",UploadId = initResponse.UploadId};ListPartsResponse listPartResponse = await amazonS3Client.ListPartsAsync(listPartRequest);Debug.Assert(listPartResponse.Parts.Count == 3);// Complete the multipart upload  分片上传完后合并CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest{BucketName = "test",Key = "Item1",UploadId = initResponse.UploadId,PartETags = new List<PartETag>{new PartETag { ETag = up1Response.ETag, PartNumber = 1 },  //ETag就是分片信息new PartETag { ETag = up2Response.ETag, PartNumber = 2 },new PartETag { ETag = up3Response.ETag, PartNumber = 3 }}};CompleteMultipartUploadResponse compResponse = await amazonS3Client.CompleteMultipartUploadAsync(compRequest);return Ok();
}
#endregion 后端进行分片上传示例

整理后的后端进行分片上传

#region 后端进行分片上传示例
/// <summary>
/// 后端进行分片上传示例
/// </summary>
/// <param name="path">要上传的文件路径</param>
/// <param name="key">上传到MinIO的路径</param>
/// <returns></returns>
[HttpPost]
public virtual async Task<IActionResult> UploadPartTestAsync(string path, string key)
{try{AmazonS3Config config = new AmazonS3Config(){ServiceURL = _configuration["MinIO:ServiceURL"]  //"http://192.168.50.36:9090/",//ServiceURL = "https://folder.s3.amazonaws.com/",//RegionEndpoint = Amazon.RegionEndpoint.CNNorth1};int MB = (int)Math.Pow(2, 20);  //以兆(M)为单位(等同于1*1024*1024)List<PartETag> partETagList = new List<PartETag>();int partSize = 30 * MB;  //每片大小// Create a clientusing AmazonS3Client amazonS3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);Stopwatch sw = new Stopwatch();sw.Start();//文件流//Stream inputStream = formFile.OpenReadStream(); //Create13MBDataStream();//var files = Request.Form.Files;using Stream inputStream = new FileStream(path, FileMode.OpenOrCreate);//await files[0].CopyToAsync(inputStream);// Initiate multipart uploadInitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest{BucketName = _configuration["MinIO:Bucket"],Key = key};//初始化分片上传,得到UploadId//InitiateMultipartUploadResponse initResponse = client.InitiateMultipartUpload(initRequest);InitiateMultipartUploadResponse initResponse = await amazonS3Client.InitiateMultipartUploadAsync(initRequest);TimeSpan ts = sw.Elapsed;sw.Restart();//得到URL//GetPreSignedUrlRequest urlRequest = new GetPreSignedUrlRequest()//{//    BucketName = _configuration["MinIO:Bucket"],//    Key = key,//    PartNumber = 1,//    Expires = DateTime.Now.AddMinutes(1)//};//分片数//int partCount = (int)Math.Ceiling((decimal)formFile.Length / partSize);int partCount = (int)Math.Ceiling((decimal)inputStream.Length / partSize);var tasks = new List<Task<UploadPartResponse>>();for (int i = 1; i <= partCount; i++){UploadPartRequest uploadRequest = new UploadPartRequest();uploadRequest.BucketName = _configuration["MinIO:Bucket"];uploadRequest.Key = key;uploadRequest.UploadId = initResponse.UploadId;uploadRequest.PartNumber = i;uploadRequest.InputStream = inputStream;if (i != partCount){uploadRequest.PartSize = partSize;}//进行分片上传UploadPartResponse up1Response = await amazonS3Client.UploadPartAsync(uploadRequest);//tasks.Add(Task.Run(async () => await amazonS3Client.UploadPartAsync(uploadRequest)));PartETag partETag = new PartETag { ETag = up1Response.ETag, PartNumber = i };partETagList.Add(partETag);}//UploadPartResponse[] resultArr = await Task.WhenAll(tasks.ToArray());//for (int i = 0; i < resultArr.Length; i++)//{//    PartETag partETag = new PartETag { ETag = resultArr[i].ETag, PartNumber = i };//    partETagList.Add(partETag);//}TimeSpan ts2 = sw.Elapsed;sw.Restart();List parts for current upload(列出当前上载的部件)//ListPartsRequest listPartRequest = new ListPartsRequest//{//    BucketName = _configuration["MinIO:Bucket"],//    Key = key,//    UploadId = initResponse.UploadId//};//ListPartsResponse listPartResponse = await amazonS3Client.ListPartsAsync(listPartRequest);//Debug.Assert(listPartResponse.Parts.Count == partCount);//TimeSpan ts3 = sw.Elapsed;//sw.Restart();// Complete the multipart upload  合并上传CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest{BucketName = _configuration["MinIO:Bucket"],Key = key,UploadId = initResponse.UploadId,PartETags = partETagList};CompleteMultipartUploadResponse compResponse = await amazonS3Client.CompleteMultipartUploadAsync(compRequest);TimeSpan ts4 = sw.Elapsed;sw.Restart();return Ok(new { Success = true, Message = "" });}catch (Exception ex){return Ok(new { Success = true, Message = ex.Message });}
}
#endregion 后端进行分片上传示例

http://www.lryc.cn/news/279818.html

相关文章:

  • 如何有效提高矢量网络分析仪的动态范围
  • Python 安卓开发:Kivy、BeeWare、Flet、Flutter
  • 50天精通Golang(第16天)
  • imx6ull基于yocto工程的l汇编点亮ed
  • vue 前端等比例压缩图片(再转换成文件后上传后端)
  • 解决在eclipse2021中,用mysql-connector-java-8.0.18.jar不兼容,导致无法访问数据库问题
  • 5 微信小程序
  • 百度面经整理(2024最新)
  • c++的构造函数
  • 基于ZU19EG的100G-UDP解决方案
  • 行为型设计模式——备忘录模式
  • 自定义HBase负载均衡器MyCustomBalancer实现步骤与代码解析
  • 企业网站建设中常用的英文翻译
  • vscode运行Python的两种方法,及无法运行的原因
  • 【猫头虎分享】全面揭秘鸿蒙4.0:华为的技术革新与市场影响
  • Java内存模型之可见性
  • 【docker】Docker Compose 使用介绍
  • uniapp怎么开发插件并发布
  • 为什么不直接public,多此一举用get、set,一文给你说明白
  • golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞
  • 【Postman-windows-9.12.2版本安装与汉化】
  • 11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)
  • Grafana Promtail 配置解析
  • 电脑DIY-主板参数
  • JVM知识总结(持续更新)
  • 信息系统安全——基于 KALI 和 Metasploit 的渗透测试
  • 05. 深入理解 GPT 架构
  • PHP开发日志 ━━ php8.3安装与使用组件Xdebug
  • Python - 深夜数据结构与算法之 Two-Ended BFS
  • langchain-Agent-工具检索