我正在生成一个预先签名的 URL 服务器端,以允许我的客户端应用程序将文件直接上传到 S3 存储桶。除非客户端应用程序在技术上比我的服务器时钟早一天的时区中的计算机上运行,否则一切正常。
我可以通过将系统时钟提前到第二天的时区来在本地重新创建问题。
这是我使用 .NET SDK 生成预签名 URL 的方式(我最初使用的是 DateTime.Now 而不是 UTCNow):
var request = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = objectName,
Verb = HttpVerb.PUT,
Expires = DateTime.UtcNow.AddDays(5),
ContentType = "application/octet-stream"
};
request.Headers["x-amz-acl"] = "bucket-owner-full-control";
request.Metadata.Add("call", JsonConvert.SerializeObject(call).ToString());
return client.GetPreSignedURL(request);
Run Code Online (Sandbox Code Playgroud)
然后我在客户端应用程序中使用该预签名 URL,如下所示:
using (var fileStream = new FileStream(recordingPath, FileMode.Open))
using (var client = new WebClient())
{
HttpContent fileStreamContent = new StreamContent(fileStream);
var bytes = await fileStreamContent.ReadAsByteArrayAsync();
client.Headers.Add("Content-Type", "application/octet-stream");
//include metadata in PUT request
client.Headers.Add("x-amz-meta-call", JsonConvert.SerializeObject(Call));
await …Run Code Online (Sandbox Code Playgroud)