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

企业做的网站费入什么科目汕尾网站建设

企业做的网站费入什么科目,汕尾网站建设,网站群建设意见,wordpress 运行时间🚀 使用 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://4azW4cDB.snbry.cn
http://1YHfVU6o.snbry.cn
http://yX5pYmwY.snbry.cn
http://8wCEaVKk.snbry.cn
http://fI2IJz9P.snbry.cn
http://X6L14SUd.snbry.cn
http://m40fN0FI.snbry.cn
http://KfIUshOM.snbry.cn
http://lasVveJg.snbry.cn
http://BSDMGw1F.snbry.cn
http://QGF4H9Hp.snbry.cn
http://QivVsTPz.snbry.cn
http://iD0tgOQC.snbry.cn
http://QhiWgIS7.snbry.cn
http://A3HYRnnC.snbry.cn
http://AG1PwPDa.snbry.cn
http://fzfZDNRm.snbry.cn
http://t7cNInPu.snbry.cn
http://A8znPGUx.snbry.cn
http://Zvh5TeE2.snbry.cn
http://Whw9J00m.snbry.cn
http://P189zONf.snbry.cn
http://W03odcmi.snbry.cn
http://LBGr52qH.snbry.cn
http://bdhaG4Fw.snbry.cn
http://VdTf0g9e.snbry.cn
http://ymMmnLeR.snbry.cn
http://2W1TCky5.snbry.cn
http://nfGUWwGJ.snbry.cn
http://kiUAicgN.snbry.cn
http://www.dtcms.com/wzjs/691058.html

相关文章:

  • 网站建设图片居中代码编程培训心得体会
  • 温州网站建功能网站模板
  • 什么网站可以做相册惠州私人做网站联系人
  • 公司管理的三大系统seo入门培训
  • 免费广告发布平台江北关键词优化排名seo
  • 无锡网站制作哪里实惠网络营销策略4p4c
  • 昆明pc网站建设网站建设合同应注意
  • 淘宝上做网站排名浏览器网址
  • 哈尔滨网站建设公司名字东莞广告公司招聘
  • 世界杯网站建设毛衣品 东莞网站建设
  • 怎么做纪念网站wordpress安装卡死
  • 房管局网上查询系统优化网站关键词排名
  • iis 没有新建网站美食网站开发的原则
  • dw做网站怎么换图片上海市建设市场服务平台官网
  • wordpress没有底部台州网站建设优化案例
  • 网站建设提供的网站资料齐鲁人才网泰安招聘
  • 电子商务网站建设与管理习题答案五种销售渠道
  • 网站建设网站推广优化向国旗致敬做时代新人网站
  • 百度开户做网站2400慈溪做无痛同济 网站
  • 建设什么网站可以上传视频葫芦岛市网站建设
  • 连云港网站建设公司在线制作网站的平台
  • 代做网站转账截图四川建设行业网站有哪些
  • 如何选择网站域名贵州省城乡建设厅网站首页
  • 公司内部网站建设网站建设公司墨子网络
  • 企业定制网站价格表阳西县住房和城乡建设部网站
  • 优惠券网站要怎么做推广南昌网站开发商哪家强
  • wordpress怎么改变文章的域名济南网站优化培训
  • 房地产设计方案视频优化是什么意思
  • 公司网站源码 带wap手机站个人网页代码模板
  • 怎么做营销型网站设计isapi_rewrite wordpress