odf_new/server/ZR.Admin.WebApi/Controllers/Business/CosUploadController.cs
zpc a6c639dd43
All checks were successful
continuous-integration/drone/push Build is passing
21
2026-04-05 16:51:24 +08:00

91 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using COSXML;
using COSXML.Auth;
using COSXML.Model.Tag;
namespace ZR.Admin.WebApi.Controllers.Business
{
/// <summary>
/// COS 预签名上传
/// </summary>
[Route("business/CosUpload")]
public class CosUploadController : BaseController
{
private readonly IConfiguration _config;
public CosUploadController(IConfiguration config)
{
_config = config;
}
/// <summary>
/// 获取 COS PUT 预签名 URL前端直传
/// </summary>
[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<object>();
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
{
/// <summary>
/// 需要上传的文件数量
/// </summary>
public int Count { get; set; } = 1;
/// <summary>
/// 文件扩展名,如 .jpg
/// </summary>
public string Ext { get; set; } = ".jpg";
}
}