2014-12-07 2 views
0

У меня есть приложение nodejs, которое генерирует подписанный URL для загрузки файлов в AWS S3. Я хочу использовать этот подписанный URL для загрузки файла на S3 из приложения winforms C#.Не удается загрузить на s3 сгенерированный nodejs подписанный url

В моей C# код, когда я использую подписанный URL, который я получаю от моего сервера nodejs для загрузки файла на S3, я получаю эту ошибку:

The connection was forcibly closed by the remote host 

Но если я использую C# для создания Подписанный url, файл успешно загружается. Я пробовал кодировать и расшифровывать URL-адрес, который я получаю от nodejs без везения. Оба сервера C# и nodejs работают в моем локальном хосте, поэтому не должно быть разницы во времени.

Пример URL, который генерируется в C# (рабочий) и 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 код генерации подписанный URL: генерирующий

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

C# код Подписанный URL:

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

вместо этого.

Смежные вопросы