构造函数初始化ossClient:
private readonly IOSSService _OSSService;
private readonly OssClient _ossClient;
public SysFileService(
IOptions<OSSProviderOptions> oSSProviderOptions,
IOptions<UploadOptions> uploadOptions,
IOSSServiceFactory ossServiceFactory,
OssClient ossClient)
{
_OSSProviderOptions = oSSProviderOptions.Value;
_uploadOptions = uploadOptions.Value;
if (_OSSProviderOptions.IsEnable)
_OSSService = ossServiceFactory.Create(Enum.GetName(_OSSProviderOptions.Provider));
_ossClient = ossClient;
}
具体的逻辑如下
/// <summary>
/// 根据链接生成带签名的URL,并重命名返回签名URL
/// </summary>
/// <param name="ossObjectLink">oss链接,非全链接</param>
/// <param name="fileName">文件名称</param>
/// <returns></returns>
public string GenerateSignedUrlAndRedirect(string ossObjectLink, string fileName)
{
if (_OSSProviderOptions.IsEnable && !string.IsNullOrEmpty(ossObjectLink))
{
string bucketName = _OSSProviderOptions.IsEnable ? _OSSProviderOptions.Bucket : "Local";
//设置签名URL的有效期
var expiration = DateTime.Now.AddMinutes(5);
string originalExtension = Path.GetExtension(ossObjectLink);
string newFileNameWithExtension = fileName + originalExtension;
var respHeaders = new ResponseHeaderOverrides();
respHeaders.ContentType = "application/octet-stream";
respHeaders.ContentDisposition = $"attachment; filename=" + newFileNameWithExtension;
var request = new GeneratePresignedUriRequest(bucketName, ossObjectLink, SignHttpMethod.Get)
{
Expiration = expiration,
ResponseHeaders = respHeaders
};
var signedUrl = _ossClient.GeneratePresignedUri(request).ToString();
return signedUrl;
}
else
{
return "";
}
}
注意:上传oss文件的时候,要把这个文件设置为private的
/// <summary>
/// 设置oss链接访问权限
/// </summary>
/// <param name="ossObjectLink">OSS链接,相对路径</param>
public void getSetBucketAcl(string ossObjectLink)
{
/* 私有 CannedAccessControlList.Private.
* 公共读 CannedAccessControlList.PublicRead
* 公共读写 CannedAccessControlList.PublicReadWrite
*/
try
{
if (_OSSProviderOptions.IsEnable)
{
_ossClient.SetObjectAcl(_OSSProviderOptions.Bucket, ossObjectLink, CannedAccessControlList.Private);
}
}
catch (Exception ex)
{
Console.WriteLine("Error getSetBucketAcl(): " + ex.Message);
}
}
💬 评论