C#+阿里云OSS+生成签名url+并重命名文件

 2023-12-25    0 条评论    224 浏览 OSS C# 签名url

构造函数初始化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);
        }
    }