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

这篇具有很好参考价值的文章主要介绍了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 client
    using AmazonS3Client amazonS3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);

    // Define input stream
    Stream inputStream = formFile.OpenReadStream(); //Create13MBDataStream();

    // Initiate multipart upload
    InitiateMultipartUploadRequest 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 1
    UploadPartRequest 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 2
    uploadRequest = new UploadPartRequest
    {
        BucketName = "test",
        Key = "Item1",
        UploadId = initResponse.UploadId,
        PartNumber = 2,
        PartSize = 6 * MB,
        InputStream = inputStream
    };
    UploadPartResponse up2Response = await amazonS3Client.UploadPartAsync(uploadRequest);

    // Upload part 3
    uploadRequest = new UploadPartRequest
    {
        BucketName = "test",
        Key = "Item1",
        UploadId = initResponse.UploadId,
        PartNumber = 3,
        InputStream = inputStream
    };
    UploadPartResponse up3Response = await amazonS3Client.UploadPartAsync(uploadRequest);

    // List parts for current upload
    ListPartsRequest 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 后端进行分片上传示例

整理后的后端进行分片上传文章来源地址https://www.toymoban.com/news/detail-778900.html

#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 client
        using 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 upload
        InitiateMultipartUploadRequest 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 后端进行分片上传示例

到了这里,关于MinIO (五) .net core实现分片上传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Minio大文件分片上传、断点续传实现

    使用minio api实现分片上传及断点续传功能。 前端准备:获取大文件的MD5值,将文件分片,5M为一分片,排好顺序,并按顺序命名(1,2,3这种后面比较好合并) 在上传分片阶段,前端有上传进度条 1、检验文件MD5值 1.1 redis中查看MD5是否存在 1.2 判断临时文件夹是否存在 boolean d

    2024年02月09日
    浏览(53)
  • springboot整合Minio + vue 实现文件分片上传(完整代码)

    网上关于minio分片上传的资料不太详细,缺斤少两,所以我基于他们的代码做了一些修改,demo能够正常运行起来,但是偶尔也会发生一些小bug,不过这些都无伤大雅,最终目的是理解代码背后的逻辑和流程 流程: 前端获取生成文件MD5,发送至后台判断是否有该文件缓存,有

    2024年02月02日
    浏览(54)
  • SpringBoot整合minio实现断点续传、分片上传(附源码)

    在Web开发中,大文件的上传是必不可少的功能之一。本文将介绍如何使用SpringBoot整合minio实现一个简单的大文件上传网站。 项目下载 gitee:https://gitee.com/wusupweilgy/springboot-vue.git 前端:vue2、element-ui组件、axios 后端:springboot、minio、mybatis-plus、redis 断点续传 分片上传 前端显示

    2024年02月04日
    浏览(53)
  • Spring Boot整合Minio实现上传凭证、分片上传、秒传和断点续传

    Spring Boot整合Minio后,前端的文件上传有两种方式: 文件上传到后端,由后端保存到Minio 这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、权限控制、文件与处理等,并且可以做一些额外的业务逻辑,比如生成缩略图、提取元数据等。 缺点也很明显: 延迟时

    2024年02月04日
    浏览(49)
  • MINIO服务器基于AWS S3 SDK 文件分片上传及下载(C++实现)

    安装环境依赖: 获取SDK源码并安装: 项目中CMakeLists.txt配置: SDK文档资料 C++_SDK.pdf 实现下载的整体类代码下载 具体内容如下

    2024年04月10日
    浏览(68)
  • 09 视频分片上传Minio和播放

    pom.xml application.yml com.example.web.dto.file.FileResp com.example.web.dto.file.MinioObject com.example.utils.FileMd5Util com.example.utils.MinioFileUtil com.example.blh.file.FileBlh com.example.web.rest.file.FileRest HTML效果 http://127.0.0.1:8081/test/upload.html resources/static/upload.html ckplayer ckplayer是一款在网页上播放视频的软件,

    2024年02月04日
    浏览(48)
  • Java大文件分片上传(minio版),超详细

    本文使用spring boot 结合minio文件服务做的大文件分片上传,思路:①:初始化文件调用后端接口,后端再调用minio把文件分片成几份,生成每个分片的minio上传url②:把提起分片好的文件依次调用上一把返回的url ③:调用合并分片文件接口,完成上传 PS:文件并未经过后端服务

    2024年02月07日
    浏览(50)
  • .net core 上传文件大小限制

    微软官网文档中给的解释是.net core 默认上传文件大小限制是30M,所以即便你项目里没有限制,这里也有个默认限制。 官网链接地址 总结了一下解决办法: 1.首先项目里添加一个web.config自定义配置文件 在配置文件中加上这段配置 !--//上传文件大小限制IIS设置 256M --   system.

    2024年02月09日
    浏览(59)
  • .NET Core WebAPI 基础 文件上传

    昨天分享了一个在WebApi中如何接收参数的文章 传送门,然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。 通常来说,上传文件,我们是使用POST,还是老规矩先上代码: 这是需要上传的txt文件。 这里有一个需要注意的地方,就是上

    2024年02月11日
    浏览(35)
  • ASP.NET Core MVC 从入门到精通之文件上传

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包