最近在做国外业务 :用到亚马逊s3服务 。上传文件到对象存储。发现有意思的事情:而且决绝问题的文档少的可怜。所有这边记录下 方便大家填坑
- 国内像阿里云这种,上传文件时候获取一次签名。然后就能继续使用签名上传任何文件。
- aws s3 默认上传文件时提前获取文件名称和类型来获取上传 url(签名),并通过 put方式上传。就是说 上传文件的名称和类型 已经包含在签名中了 。这样以来前端就能不能说想传什么就传什么了。 安全吧 好像是更安全,
但是我这边是im这就能点蛋疼了。后来经不断试过 发现s3 也是支持。获取一次签名之后 随便传文件的方式:
1.获取s3 上传凭证:
后端采用开发c#,就随便写了个获取前面的 demo
namespace aws_s3 { internal class S3PresignedPostExample { public async Task<CreatePresignedPostResponse> CreatePresignedPostWithConditions( IAmazonS3 s3Client, string bucketName) { var request = new CreatePresignedPostRequest { BucketName = bucketName, Key = "uploads/${filename}", // 动态文件名 Expires = DateTime.UtcNow.AddHours(2) }; // 添加自定义字段 request.Fields.Add("acl", "private"); request.Conditions.Add(new StartsWithCondition("key", "uploads/")); request.Conditions.Add(new ContentLengthRangeCondition(1, 10485760));//10mb return await s3Client.CreatePresignedPostAsync(request); } // 使用示例 public async Task Example() { string accessKey = "AKIA5SIW********"; string secretKey = "fMxL4N235Uhrysmf****************"; var config = new AmazonS3Config { RegionEndpoint = RegionEndpoint.APNortheast1 // 改成你的 bucket 所在 region }; var s3Client = new AmazonS3Client(accessKey, secretKey, config); var response = await CreatePresignedPostWithConditions( s3Client, "catgamebucket" ); Console.WriteLine($"URL: {response.Url}"); Console.WriteLine("Fields:"); foreach (var field in response.Fields) { Console.WriteLine($" {field.Key}: {field.Value}"); } } } }运行起来就是这个东西:
2.postman 上传文件
上面这样就是上传成功了,需要注意的是参数的顺序。一定要像上面这样。这样就能前端定义文件名称 实现随便上传了

