.NET 6集成AWS S3

客户端连接工具

S3 Browser - Amazon S3 Client for Windows. User Interface for Amazon S3. S3 Bucket Explorer.

Nuget包

AWSSDK.S3

代码

配置项

public class AWSS3Configuration
{
    public string AccessKeyId { get; set; }
    public string SecretAccessKey { get; set; }
    public string BucketName { get; set; }
    public string EndPoint { get; set; }
    public string UrlBase { get; set; }
    public int UploadLimitSize { get; set; }
}

appsetting中添加S3配置,program中注入配置

"AWSS3Configuration": {
  "AccessKeyId": "*****************",
  "SecretAccessKey": "*****************",
  "UrlBase": "https://*****************.s3.cn-north-1.amazonaws.com.cn/",
  "BucketName": "test",
  "EndPoint": "CNNorth1",
  "UploadLimitSize": 20
}
services.Configure<AWSS3Configuration>(configuration.GetSection("AWSS3Configuration"));

创建S3服务

public class AwsS3IntegrationClient: IAwsS3IntegrationClient
{
    private readonly AmazonS3Client _awsS3Client;
    private readonly TransferUtility _transferUtility;
    private readonly AWSS3Configuration _awsS3Configuration;
    private static RegionEndpoint _bucketRegion;

    public AwsS3IntegrationClient(IOptions<AWSS3Configuration> awsS3Configuration)
    {
        _awsS3Configuration = awsS3Configuration.Value;
        _bucketRegion = typeof(RegionEndpoint).GetField(_awsS3Configuration.EndPoint).GetValue(null) as RegionEndpoint;
        _awsS3Client = new AmazonS3Client(_awsS3Configuration.AccessKeyId, _awsS3Configuration.SecretAccessKey, _bucketRegion);
        _transferUtility = new TransferUtility(_awsS3Client);
    }

    public async Task<(bool success, string msg)> UploadFileAync(string contentType, Stream stream, string key, long fileSize)
    {
        try
        {
            var uploadRequest = new TransferUtilityUploadRequest
            {
                InputStream = stream,
                Key = key,
                BucketName = _awsS3Configuration.BucketName,
                ContentType = contentType,
                CannedACL = S3CannedACL.PublicRead
            };
            await _transferUtility.UploadAsync(uploadRequest);
            return (true, null);
        }
        catch (Exception ex)
        {
            return (false, ex.ToString());
        }
    }
}

添加测试接口及方法

public class S3TestService : IS3TestService
{
    private readonly IAwsS3IntegrationClient _awsS3IntegrationClient;
    private readonly AWSS3Configuration _awsS3Configuration;
    public S3TestService(IAwsS3IntegrationClient awsS3IntegrationClient, IOptions<AWSS3Configuration> awsS3Configuration)
    {
        _awsS3IntegrationClient = awsS3IntegrationClient;
        _awsS3Configuration = awsS3Configuration.Value;
    }

    public async Task<string> UploadToS3(IFormFile file)
    {
        var fileSize = file.Length / 1024 / 1024;
        if (fileSize >= _awsS3Configuration.UploadLimitSize)
            throw new CustomResponseException($"上传文件大小超出限制");

        new FileExtensionContentTypeProvider().TryGetContentType(file.FileName, out var contentType);
        var key = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
        var (success, msg) = await _awsS3IntegrationClient.UploadFileAync(contentType, file.OpenReadStream(), key, file.Length / 1024 / 1024);

        var path = $"{_awsS3Configuration.UrlBase}{key}";
        return path;
    }
}
[Route("api/[controller]")]
[ApiController]
public class S3TestController : ControllerBase
{
    private readonly IS3TestService _iS3TestService;

    public S3TestController(IS3TestService iS3TestService)
    {
        _iS3TestService = iS3TestService;
    }


    [HttpPost]
    public async Task<ResponseBaseInfo> Index(IFormFile file)
    {
        var data = await _iS3TestService.UploadToS3(file);
        return new ResponseBaseInfo(true, data);
    }
}

上传成功,测试通过。

关于节点

国内有两个节点:北京与宁夏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值