91 lines
2.9 KiB
C#
91 lines
2.9 KiB
C#
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";
|
||
}
|
||
}
|