using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using COSXML; using COSXML.Auth; using COSXML.Model.Tag; namespace ZR.Admin.WebApi.Controllers.Business { /// /// COS 预签名上传 /// [Route("business/CosUpload")] public class CosUploadController : BaseController { private readonly IConfiguration _config; public CosUploadController(IConfiguration config) { _config = config; } /// /// 获取 COS PUT 预签名 URL(前端直传) /// [HttpPost("presignUrl")] public IActionResult GetPresignUrl([FromBody] CosPresignRequestDto dto) { var section = _config.GetSection("TencentCos"); var appId = section["AppId"]; var bucket = section["Bucket"]; var region = section["Region"]; var secretId = section["SecretId"]; var secretKey = section["SecretKey"]; var domainUrl = section["DomainUrl"]; var expireMinutes = int.Parse(section["PresignExpireMinutes"] ?? "10"); int count = Math.Clamp(dto.Count, 1, 9); string ext = string.IsNullOrWhiteSpace(dto.Ext) ? ".jpg" : dto.Ext; var cosConfig = new CosXmlConfig.Builder() .SetRegion(region) .Build(); var credentialProvider = new DefaultQCloudCredentialProvider( secretId, secretKey, (long)expireMinutes * 60); var cosXml = new CosXmlServer(cosConfig, credentialProvider); var results = new List(); var dateDir = DateTime.Now.ToString("yyyyMMdd"); for (int i = 0; i < count; i++) { var cosKey = $"fault-images/{dateDir}/{Guid.NewGuid():N}{ext}"; var preSignatureStruct = new PreSignatureStruct { appid = appId, bucket = bucket, region = region, key = cosKey, httpMethod = "PUT", isHttps = true, signDurationSecond = expireMinutes * 60, headers = null, queryParameters = null }; var presignUrl = cosXml.GenerateSignURL(preSignatureStruct); var accessUrl = $"{domainUrl.TrimEnd('/')}/{cosKey}"; results.Add(new { cosKey, presignUrl, accessUrl }); } return SUCCESS(results); } } public class CosPresignRequestDto { /// /// 需要上传的文件数量 /// public int Count { get; set; } = 1; /// /// 文件扩展名,如 .jpg /// public string Ext { get; set; } = ".jpg"; } }