首页 > 其他分享 >NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决

NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决

时间:2024-06-18 20:00:04浏览次数:14  
标签:文件 MinIO 服务器端 url NetMvc saveKey var 上传 string

前言:

1、由于项目是.NET Framework 4.7 MVC LayUI,所以需要找一个资源站点存放项目中静态资源文件;

2、需要支持服务端和客户端都支持上传文件方式;

3、调用简单,涉及库越少越好。

结果:

调用 AWSSDK.S3 和 AWSSDK.Core 实现文件上传到 MinIO ;调用MimeMapping获取文件ContentType

MinIO

Minio是Apache License v2.0下发布的对象存储服务器。它与Amazon S3云存储服务兼容。它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM映像。对象的大小可以从几KB到最大5TB Minio服务器足够轻,可以与应用程序堆栈捆绑在一起,类似于NodeJS,Redis和MySQL。

AWS S3

全称:(Amazon Simple Storage Service), 是一种面向网络的存储服务,可以支持用户随时在Web的任何位置,存储和检索任意大小的数据本身也提供了简单而直观的管理控制台来处理这些任务,但我这里使用的是,面向C# 方向的S3网络存储服务。

具体调研实现方法如下

1、服务器的配置

推荐版本:minio.RELEASE.2022-05-26T05-48-41Z

当前版本文件可来取自如。

2、服务端上传实现代码

需要NuGit调用有三项

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AWSSDK.Core" version="3.7.304.16" targetFramework="net47" />
  <package id="AWSSDK.S3" version="3.7.309.4" targetFramework="net47" />
  <package id="MimeMapping" version="3.0.1" targetFramework="net47" />
</packages>

具体实现代码

using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;

namespace DealMvc.AmazonS3 {
    /// <summary>
    /// 实现MinIO文件的上传
    /// 调用 AWSSDK.S3 和 AWSSDK.Core 
    /// 文件的 ContentType 调用 MimeMapping 实现
    /// </summary>
    public class AmazonHelper {
        /// <summary>
        /// Bucket访问AccessKey
        /// </summary>
        readonly string AccessKey = "admin";
        /// <summary>
        /// Bucket访问SecretKey
        /// </summary>
        readonly string SecretKey = "123456+++";
        /// <summary>
        /// 存储桶名称
        /// </summary>
        readonly string BucketName = "test";
        /// <summary>
        /// 服务地址
        /// </summary>
        readonly string ServiceURL = "http://192.168.20.66:9000";
        /// <summary>
        /// 预览地址
        /// </summary>
        readonly string WebURL = "https://res.test.cn";
        /// <summary>
        /// 
        /// </summary>
        //readonly string awsRegion = "us-east-1";

        readonly AmazonS3Client client;
        /// <summary>
        /// 构造函数
        /// </summary>
        public AmazonHelper() {
            //提供awsAccessKeyId和awsSecretAccessKey构造凭证
            var credentials = new BasicAWSCredentials(AccessKey, SecretKey);
            //提供awsEndPoint(域名)进行访问配置
            var clientConfig = new AmazonS3Config {
                // 必须在设置ServiceURL前进行设置,并且需要和`MINIO_REGION`环境变量一致。
                //RegionEndpoint = RegionEndpoint.GetBySystemName(awsRegion),
                RegionEndpoint = RegionEndpoint.USEast1,
                // 替换成你自己的MinIO Server的URL
                ServiceURL = ServiceURL,
                // 必须设为true
                ForcePathStyle = true,
            };
            client = new AmazonS3Client(credentials, clientConfig);
        }

        #region 上传文件
        /// <summary>
        /// 上传文件[本地]
        /// </summary>
        /// <param name="key"></param>
        /// <param name="filePath">路径</param>
        /// <returns>网址</returns>
        public async Task<string> UploadFilePath(string saveKey, string filePath) {
            var request = new PutObjectRequest {
                BucketName = BucketName,
                Key = saveKey,
                ContentType = GetContentType(saveKey),
                FilePath = filePath,
            };
            var response = await client.PutObjectAsync(request);
            //
            return WebUrlKey(response.HttpStatusCode, saveKey);
        }
        /// <summary>
        /// 上传文件[流]
        /// </summary>
        public async Task<string> UploadInputStream(string saveKey, Stream inputStream) {
            var request = new PutObjectRequest {
                BucketName = BucketName,
                Key = saveKey,
                ContentType = GetContentType(saveKey),
                InputStream = inputStream //File.OpenRead
            };
            var response = await client.PutObjectAsync(request);
            //
            return WebUrlKey(response.HttpStatusCode, saveKey);
        }
        #endregion

        /// <summary>
        /// 客户端上传文件
        /// </summary>
        public string GetPreSignedUrl(string saveKey) {
            var request = new GetPreSignedUrlRequest {
                BucketName = BucketName,
                Key = saveKey,
                Expires = DateTime.UtcNow.AddMinutes(15),
                Verb = HttpVerb.PUT,
                ContentType = GetContentType(saveKey),
                Protocol = Protocol.HTTP // 指定使用HTTPS协议
            };
            var url= client.GetPreSignedURL(request);
            return url;
        }

        #region 私有方法
        /// <summary>
        /// 根据文件Key返回预览地址
        /// </summary>
        private string WebUrlKey(HttpStatusCode statusCode, string saveKey) {
            if (statusCode != System.Net.HttpStatusCode.OK)
                throw new Exception("上传文件失败");
            return WebURL + "/" + BucketName + "/" + saveKey;
        }

        /// <summary>
        /// 根据文件获取ContentType
        /// </summary>
        private string GetContentType(string saveKey) {
            return MimeMapping.MimeUtility.GetMimeMapping(Path.GetFileName(saveKey));
        } 
        #endregion
    }
}

控制器中实现代码


// 用于服务端本地文件
[HttpGet]
public async Task<ActionResult> UpFilePathAmazon() {
    var filePath = @"D:\a\KAT\01.jpg";
    var key = "kat/" + 0L.NewLongId() + System.IO.Path.GetExtension(filePath);
    var url = await amazon.UploadFilePath(key, filePath);
    return Content(url);
}

// 用于服务端上传文件
[HttpGet]
public async Task<ActionResult> UpFileStreamAmazon() {
    ///pdfFile[0].OpenReadStream()
    var filePath = @"D:\a\KAT\02.jpg";
    var key = "kat/" + 0L.NewLongId() + System.IO.Path.GetExtension(filePath);
    var stream = System.IO.File.OpenRead(filePath);
    var url = await amazon.UploadInputStream(key, stream);
    return Content(url);
}

// 用于客户端上传文件
[HttpPost]
public ActionResult UploadImgUrl(string filename) {
    string fileType = "images";
    string fileExt = System.IO.Path.GetExtension(filename).ToLower();
    string saveKey = fileType+"/" + 0L.NewLongId() + fileExt;
    var url = new DealMvc.AmazonS3.AmazonHelper().GetPreSignedUrl(saveKey);

    return JsonMessageData(new{
        url,
    });
}

前端页面实现方式(代码中涉及到)

代码中涉及到LayUI前端框架如下:

上传组件 upload - Layui 文档

HTML代码

<form class="layui-form" lay-filter="subform">
    <div class="layui-form-item">
        <label class="layui-form-label"><em>*</em>广告图片</label>
        <div class="layui-input-inline" style="width: 660px;">
            <div class="flex align-center margin-bottom-sm">
                <button type="button" class="layui-btn layui-btn-primary layui-border-green layui-btn-sm margin-right-sm" id="ID-PicUrl">
                    <i class="layui-icon layui-icon-upload"></i> 上传图片
                </button>
                <div class="">宽高比例按4:3,格式png、jpg</div>
            </div>
            <input name="PicUrl" lay-verify="required" lay-reqtext="请上传 广告图片" autocomplete="off" class="layui-input" />            
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="button" class="layui-btn" onclick="uploadFile()">Upload</button>
        </div>
    </div>
</form>

JavaScript代码

layui.use(function () {
    var upload = layui.upload;
    var layer = layui.layer;

    //执行upload组件实例
    upload.render({
        auto: false,//选择文件后不自动上传
        elem: '#ID-PicUrl', //绑定元素
        acceptMime: 'image/jpeg, image/png, image/gif',
        choose: function (obj) {

            //start
            var files = obj.pushFile(), thisStart = 0, keysArray = Object.keys(files);
            if (files && keysArray.length > 0) {
                keysArray.forEach(function (key) {
                    if (thisStart === keysArray.length - 1) {
                        let index = key
                            , file = files[key]
                            , resultObj = files[key]
                            ;
                        let requestData = {};
                        if (file && file.name) {
                            thisFilename = file.name;
                            requestData = { filename: thisFilename };
                        }
                        UploadToken(file, requestData);
                    } else {
                        layer.msg("上传时发生异常,请重试 ~ ", { icon: 2, time: 1500 });
                    }
                    thisStart++;
                });
            }

        }
        , error: function () {
            layer.alert("网络异常,请重试 ~ ", { title: "上传失败提示", icon: 2, })
        }
    });
    
    // 通过文件名称获取到服务器存放路径
    var UploadToken = (file, requestData) => {
        $.ajax({
            url: "/File/UploadImgUrl",
            type: "POST",
            data: requestData,
            dataType: "json",
            success: function (result) {
                //console.log("token", result)
                if (result.status) {
                    let thisData = result.data;
                    UploadLoadeer(file, thisData)
                } else {
                    layer.alert("网络异常,请重试 ~ ", { title: "上传失败提示", icon: 2, })
                }
            },
            error: function () {
                layer.alert("网络异常,请重试 ~ ", { title: "上传失败提示", icon: 2, })
            }

        });
    }
    
    // 通过XMLHttpRequest 方式将文件上传到服务器
    var UploadLoadeer = (file, thisData) => {
        let { url } = thisData;
        console.log(url);
        // 使用预签名URL上传文件
        const xhr = new XMLHttpRequest();
        xhr.open('PUT', url, true);
        xhr.setRequestHeader('Content-Type', file.type);
        xhr.onload = function () {
            if (xhr.status === 200) {
                alert('File uploaded successfully.');
            } else {
                alert('File upload failed.');
            }
        };
        xhr.send(file);
    }
});

标签:文件,MinIO,服务器端,url,NetMvc,saveKey,var,上传,string
From: https://www.cnblogs.com/jake-code/p/18255014

相关文章

  • 部署、安装和测试minio
    部署MinIO在server01部署MinIO,安装方式采用rpm离线安装,具体步骤可参考官方文档。获取MinIO安装包下载地址如下:https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm,通过以下命令可直接将安装包下载至服务器wgethttps://dl.min......
  • WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理
    1、官网下载并配置下载MinIOServe地址(不需要安装,放在目录就行)https://dl.min.io/server/minio/release/windows-amd64/minio.exe设置账号和密码(cmd)setxMINIO_ROOT_USERadminsetxMINIO_ROOT_PASSWORD123456+++运行程序(添加文件minio.bat并运行)@echooffsetpath=C:\mi......
  • Minio使用(Minio帮助类 3.1.13版本 )
    目录一、安装部署二、注册成window服务三、C#文件上传下载四、minio文件操作帮助类一、安装部署1、下载安装包:MinIO|高性能,对Kubernetes友好的对象存储2、放到磁盘中,后面会以这个文件进行服务器安装3、磁盘新建一个目录用于存放上传文件,比如我创建的为:Data4、......
  • 认识和使用minio
    什么是minio?minio是一个基于ApacheLicensev2.0开源协议的轻量对象存储服务,兼容亚马逊S3接口,号称目前速度最快,在标准硬件上,对象存储的读/写速度最高可以高达183GB/s和171GB/s。官网文档地址:https://docs.min.io/cn/部署使用minio服务端#下载Minio服务器二进制文件wgeth......
  • 超好用mqtt服务器端server和客户端client协议通信学习测试工具
    超好用mqtt服务器端server和客户端client协议通信学习测试工具 作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流   软件使用注意事项:本软使用需要用户了解mqtt通信参数设置好后,要先启动软件左下角的服......
  • minio多节点部署
    MinIO是一个高性能的分布式对象存储服务,它可以配置为多节点(或多服务器)模式以提供高可用性和数据冗余。以下是一个基本的多节点MinIO部署示例:确保你有多个服务器或虚拟机。在每个节点上安装MinIO。使用minioserver命令启动多节点模式。以下是一个简单的命令行示例,展示如......
  • SpringBoot Minio 分片上传
    1、简介分片上传通常被用于各种需要处理大文件的场景,如视频平台、云存储服务等。它不仅可以加速文件上传过程,还可以提高系统的稳定性和容错性。简单来说就是:1)把大文件分割成多个小文件(比如每个5MB)2)逐个/并发上传小文件3)所有小文件都上传完后,将所有小文件合并成大文件2、主流上......
  • 使用 .NET 集成 MinIO 实现高效对象存储
    引言https://min.io/在现代软件开发中,存储和管理大量的非结构化数据(如图片、视频和文档)变得越来越重要。对象存储解决方案如AmazonS3已成为主流,但其高昂的成本和对公有云的依赖使得很多开发者寻求开源和自托管的替代方案。MinIO作为一款高性能的开源对象存储系统,以其兼容......
  • minio的一个基础使用案例:用户头像上传
    文章目录一、minio下载安装(Windows)二、案例需求分析三、后端接口开发一、minio下载安装(Windows)1.下载minio服务端和客户端minio下载地址2.手动搭建目录/minio/binmc.exeminio.exe/data/logs手动创建minio应用程序目录,如......
  • 接上篇,客户端实现,图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行
     1.项目结构 1.1基本架构本项目采用基于Java的`Swing`库进行图形界面开发,并使用`Socket`进行网络通信。项目包名为`org.example.tcp`。 1.2模块划分项目主要分为以下几个模块:图形用户界面(GUI)模块网络通信模块线程处理模块 2.GUI设计 2.1主窗口设计 2.1.1......