客户端连接工具
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);
}
}
上传成功,测试通过。
关于节点
国内有两个节点:北京与宁夏