2014-12-07 105 views
0

我有一個nodejs應用程序,它正在生成一個用於將文件上傳到AWS S3的簽名url。我想使用這個簽名的url從C#winforms應用程序上傳一個文件到S3。無法使用nodejs生成簽名url來上傳到s3

在我的C#代碼,當我用標識的URL,我從我的NodeJS服務器獲取上傳文件到S3,我得到這個錯誤:

The connection was forcibly closed by the remote host 

但是,如果使用C#用於生成簽署網址,文件成功上傳。我嘗試了編碼和解碼我從nodejs獲得的url,但沒有運氣。 C#和nodejs服務器都在我的本地主機上工作,所以應該沒有時差。

由C#生成

示例URL(工作)和由的NodeJS(不工作):

// 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 

的的NodeJS代碼生成所述簽名的網址:

// this signed url does not work 
var params = { Bucket: bucket, Key: folder + "/" + filename, Expires: 3600 }; 
s3.getSignedUrl('getObject', params, callback); 

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生成簽名url工作?

回答

1

我解決了這個問題。問題是在這條線的代碼的NodeJS:

s3.getSignedUrl('getObject', params, callback); 

這應該是

s3.getSignedUrl('putObject', params, callback); 

代替。