无法使用 nodejs 生成的签名 url 上传到 s3
本文关键字:url s3 nodejs | 更新日期: 2023-09-27 18:33:22
我有一个nodejs应用程序,它正在生成一个签名网址,用于将文件上传到AWS S3。我想使用此签名 url 将文件从 C# winforms 应用程序上传到 S3。
在我的 C# 代码中,当我使用从 nodejs 服务器获得的签名 url 将文件上传到 S3 时,出现此错误:
The connection was forcibly closed by the remote host
但是,如果我使用 C# 生成签名 url,则文件会成功上传。我尝试编码和解码我从nodejs获得的url,但没有运气。C# 和 nodejs 服务器都在我的本地主机中工作,所以应该没有时差。
由 c#(工作)和 nodejs(不工作)生成的示例 url:
// c# generated, works
https://mybucket.s3-eu-west-1.amazonaws.com/folder/547dac915711b69f18241920.flv?AWSAccessKeyId=AKIAILNOHZMPD62PBJGQ&Expires=1417970769&Signature=8ePjR1%2FrQb35YU2AR%2B6480vjiuM%3D
// nodejs generated, does not work
https://mybucket.s3-eu-west-1.amazonaws.com/folder/547dac915711b69f18241920.flv?AWSAccessKeyId=AKIAILNOHZMPD62PBJGQ&Expires=1417967527&Signature=rIbJ2zuknWwFG92Lh7VGAhqYE0I%3D
生成签名 url 的 nodejs 代码:
// this signed url does not work
var params = { Bucket: bucket, Key: folder + "/" + filename, Expires: 3600 };
s3.getSignedUrl('getObject', params, callback);
生成签名 URL 的 c# 代码:
// this signed url works
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
BucketName = "mybucket",
Key = "folder/" + _id + ".flv",
Verb = HttpVerb.PUT,
Expires = DateTime.Now.AddMinutes(5)
};
string url = null;
url = s3Client.GetPreSignedURL(request);
上传文件的 C# 代码:
HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest;
httpRequest.Method = "PUT";
using (Stream dataStream = httpRequest.GetRequestStream())
{
byte[] buffer = new byte[8000];
using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
dataStream.Write(buffer, 0, bytesRead);
}
}
}
HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse;
为什么我的 nodejs 生成的 url 不起作用,但我的 C# 生成的 url 有效?如何让我的 nodejs 生成的签名网址正常工作?
我解决了这个问题。问题出在nodejs代码中的这一行:
s3.getSignedUrl('getObject', params, callback);
应该是
s3.getSignedUrl('putObject', params, callback);
相反。