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

中国那个公司的网站做的最好看二维码网站制作

中国那个公司的网站做的最好看,二维码网站制作,计算机专业主要学什么前景怎么样,怎么把做的网站优化到百度🚀 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务 本文基于 ABP vNext MinIO 的对象存储集成实践,系统讲解从 MinIO 部署、桶创建、ABP 集成、上传 API、安全校验、预签名访问,到测试、扩展及多租户支持的全过程。目标是构建一套可复…

🚀 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务

本文基于 ABP vNext + MinIO 的对象存储集成实践,系统讲解从 MinIO 部署、桶创建、ABP 集成、上传 API、安全校验、预签名访问,到测试、扩展及多租户支持的全过程。目标是构建一套可复现、可维护、可扩展的企业级文件存储服务。


📚 目录

  • 🚀 使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
    • 📘 背景与目标
    • 🏗 技术架构与依赖
      • 🏗️ 系统架构流程图
    • 🔧 MinIO部署与桶准备
    • 🛠 集成 MinIO 到 ABP 项目
      • 1️⃣ 安装 NuGet 包
      • 2️⃣ 配置 appsettings.json
      • 3️⃣ 模块注册 + 自动建桶
      • 🛠️ 桶自动创建流程图
    • 🧩 上传服务封装
      • 定义容器接口
      • 实现上传服务
      • 🧩 上传流程图
    • 🛡 上传接口(权限 + 预览链接)
    • 🔗 访问链接生成服务
      • 🔗 预签名流程图
    • 🧠 扩展建议


📘 背景与目标

非结构化数据(图片、视频、PDF 等)管理是现代应用中的常见需求,尤其在多租户系统中,对存储隔离、安全、预览等能力要求更高。ABP vNext 提供了 BlobStoring 模块,MinIO 提供 S3 兼容的存储服务,两者结合可构建灵活高可用的文件服务系统。


🏗 技术架构与依赖

  • 框架:ABP vNext
  • 对象存储:MinIO(兼容 S3)
  • NuGet 依赖
    • Volo.Abp.BlobStoring.AmazonS3
    • AWSSDK.S3
  • 部署方式:Docker 容器部署 MinIO

🏗️ 系统架构流程图

Web 客户端
API 控制器
上传服务 (FileAppService)
容器 (IDemoBlobContainer)
MinIO Server

🔧 MinIO部署与桶准备

docker run -d -p 9000:9000 -p 9001:9001 \--name minio \-e MINIO_ROOT_USER=admin \-e MINIO_ROOT_PASSWORD=admin123 \-v /data/minio:/data \minio/minio server /data --console-address ":9001"

📍 管理控制台:http://localhost:9001
🔐 用户密码:admin / admin123
📦 桶名(Bucket):demo-bucket(可手动或代码创建)


🛠 集成 MinIO 到 ABP 项目

1️⃣ 安装 NuGet 包

dotnet add package Volo.Abp.BlobStoring.AmazonS3
dotnet add package AWSSDK.S3

2️⃣ 配置 appsettings.json

"Abp": {"BlobStoring": {"AmazonS3": {"AccessKey": "admin","SecretKey": "admin123","RegionEndpoint": "us-east-1","BucketName": "demo-bucket","ServiceUrl": "http://localhost:9000","ForcePathStyle": true}}
},
"BlobStorage": {"BasePreviewUrl": "http://localhost:9000/demo-bucket/"
}

3️⃣ 模块注册 + 自动建桶

public class BlobStorageOptions
{public string BasePreviewUrl { get; set; } = string.Empty;
}public class DemoApplicationModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){var config = context.Services.GetConfiguration();context.Services.Configure<BlobStorageOptions>(config.GetSection("BlobStorage"));context.Services.AddSingleton<IAmazonS3>(_ =>new AmazonS3Client("admin", "admin123", new AmazonS3Config{ServiceURL = "http://localhost:9000",ForcePathStyle = true}));context.Services.AddSingleton<IBlobUrlGenerator, BlobUrlGenerator>();context.Services.AddScoped<IS3SignedUrlService, S3SignedUrlService>();Configure<AbpBlobStoringOptions>(opt =>{opt.Containers.Configure<DemoBlobContainer>(c => c.UseAmazonS3());});}public override void OnApplicationInitialization(ApplicationInitializationContext context){var s3 = context.ServiceProvider.GetRequiredService<IAmazonS3>();AsyncHelper.RunSync(async () =>{const string bucket = "demo-bucket";if (!(await s3.DoesS3BucketExistAsync(bucket))){await s3.PutBucketAsync(bucket);}});}
}

🛠️ 桶自动创建流程图

应用启动
IAmazonS3 客户端
检查桶是否存在
“demo-bucket” 存在?
调用 PutBucketAsync 创建桶
继续模块初始化

🧩 上传服务封装

定义容器接口

[BlobContainer("demo-bucket")]
public interface IDemoBlobContainer : IBlobContainer {}

实现上传服务

public class FileAppService : ApplicationService
{private readonly IDemoBlobContainer _container;private readonly ILogger<FileAppService> _logger;public FileAppService(IDemoBlobContainer container, ILogger<FileAppService> logger){_container = container;_logger = logger;}public async Task<string> UploadAsync(IFormFile file){if (file == null || file.Length == 0)throw new UserFriendlyException("文件不能为空");var ext = Path.GetExtension(file.FileName).ToLower();var allowed = new[] { ".png", ".jpg", ".pdf" };if (!allowed.Contains(ext))throw new UserFriendlyException("文件类型不支持");var tenantId = CurrentTenant.Id?.ToString() ?? "public";var folder = $"{tenantId}/{DateTime.UtcNow:yyyy/MM/dd}";var fileName = $"{folder}/{Guid.NewGuid()}{ext}";await using var stream = file.OpenReadStream();_logger.LogInformation("上传文件:{File}", fileName);await _container.SaveAsync(fileName, stream, true);return fileName;}
}

🧩 上传流程图

客户端 FileController FileAppService IDemoBlobContainer MinIO POST /api/files (IFormFile) UploadAsync(file) 校验文件类型 & 大小 SaveAsync(path, stream) S3 PUT Object 返回文件名 { path, url } 客户端 FileController FileAppService IDemoBlobContainer MinIO

🛡 上传接口(权限 + 预览链接)

[Authorize]
[Route("api/files")]
public class FileController : AbpController
{private readonly FileAppService _appService;private readonly IBlobUrlGenerator _urlGen;public FileController(FileAppService appService, IBlobUrlGenerator urlGen){_appService = appService;_urlGen = urlGen;}[HttpPost]public async Task<IActionResult> Upload(IFormFile file){var path = await _appService.UploadAsync(file);var url = _urlGen.Generate(path);return Ok(new { path, url });}
}

🔗 访问链接生成服务

public interface IBlobUrlGenerator
{string Generate(string path);
}public class BlobUrlGenerator : IBlobUrlGenerator
{private readonly BlobStorageOptions _options;public BlobUrlGenerator(IOptions<BlobStorageOptions> options) => _options = options.Value;public string Generate(string path){return new Uri(new Uri(_options.BasePreviewUrl), path).ToString();}
}

🔗 预签名流程图

用户请求限时链接
S3SignedUrlService
构造 GetPreSignedUrlRequest
调用 GetPreSignedURL()
返回预签名 URL

🧠 扩展建议

能力实践方式
✅ 多租户隔离按租户ID生成路径前缀
✅ 安全预览使用 GetPreSignedUrlRequest 生成限时链接
✅ 文件分层存储使用日期+租户组合分目录
✅ 重试与监控注入 Polly 重试策略 + OpenTelemetry 埋点
✅ 单元测试使用 ReplaceService 注入 InMemoryBlobContainer

文章转载自:

http://m4KZacBP.jytrb.cn
http://wFP5nFwF.jytrb.cn
http://5jvmsQXJ.jytrb.cn
http://Gt2v3xWh.jytrb.cn
http://p65slNtf.jytrb.cn
http://QNabYuBH.jytrb.cn
http://v2pbPmt2.jytrb.cn
http://YiipDnj5.jytrb.cn
http://zdBWvPjn.jytrb.cn
http://5yPT9k5I.jytrb.cn
http://s282h55I.jytrb.cn
http://A2b41ULP.jytrb.cn
http://YhTzO4F9.jytrb.cn
http://gxbO5PCY.jytrb.cn
http://XDGoNYdG.jytrb.cn
http://6Te6qTMI.jytrb.cn
http://sdqVUSgH.jytrb.cn
http://3NsiZbLE.jytrb.cn
http://TDBgaewo.jytrb.cn
http://gilVsjiR.jytrb.cn
http://wGKLR2JY.jytrb.cn
http://D7vrWMmu.jytrb.cn
http://gTivis5o.jytrb.cn
http://ZVSLcJ7k.jytrb.cn
http://iPfeRbkU.jytrb.cn
http://QwYpHTFX.jytrb.cn
http://y4Fh98K7.jytrb.cn
http://brQ16s2P.jytrb.cn
http://GOUX3a9R.jytrb.cn
http://pwqVHJGG.jytrb.cn
http://www.dtcms.com/wzjs/733169.html

相关文章:

  • 制作一个自适应网站前端怎么接私活做网站
  • 淘宝网站建设的主图如何设计高校网站建设评比标准
  • 奎文营销型网站建设烟台网站制作哪家好
  • 在ps中做网站首页的尺寸软件开发文档国家标准
  • 专门做销售招聘网站长春网站建设q479185700棒
  • wap盛唐建站网站首页缩略图 seo
  • 深圳设计公司招聘网站什么公司能做网站建设
  • 网站制作如何做图片在线编辑器免费
  • 网站建设好评公司江西省宜春市建设局网站
  • 南通技嘉做网站优秀网站建设价格
  • 旅游订票网站开发深圳建站推广
  • 建设网站需要学什么程序课程网站建设的基本原理
  • 做网站好一点的软件自己怎么做一元购物网站
  • 如何做单位网站天使投资平台官网
  • 网站怎么推广引流网站建设使用的工具
  • 做网站优化公司佛山网站建设案例
  • 最新做做网站晋江网站建设晋江
  • 海珠企业网站建设怎样做自己的微商网站
  • 无锡网站制作计划wordpress设置首页关键词
  • 免费网站网络推广手机端网站制作
  • 网站建设 有限公司北京西站进站最新规定
  • 做装饰材料的网站企业官网型网站模板
  • 最好的网站建设免费的前端工程师做交互网站
  • 婚恋网站女生要求男生要一起做淘宝明星用什么软件做视频网站
  • 网站的特征包括哪些方面wordpress+制作首页模板下载
  • 云南省建设考试中心网站自己做网站上市
  • 网网站建设站建设asp课程设计企业网站设计
  • 君隆网站建设wordpress 内嵌播放器
  • 详细描述建设一个网站的具体步骤网上做任务网站有哪些
  • 外贸网站营销建站擅自给公司做网站有什么责任