2017-04-27 20 views
0

からファイルをダウンロードすることができません。私は、Amazon S3から画像をダウンロードするには、次のコードを使用しています:アマゾンS3

router.post('/image-upload', function (req, res, next) { 

    if (!req.files) 
     return res.status(400).send('No files were uploaded.'); 

    var file = req.files['image_' + req.session.sessID]; 

    AWS.config.loadFromPath(<credentials_path>); 

    var s3 = new AWS.S3(); 

    var params = {Bucket: credentials.aws_s3.bucket_name, Key: req.session.email, Body: file.data}; 

    s3.putObject(params, function(err, data) { 

     if (err) { 
      console.log(err) 

     } else { 

      var options = { 
       Bucket: credentials.aws_s3.bucket_name, 
       Key: req.session.email 
      }; 

      var url = s3.getSignedUrl('getObject', options); 
      console.log(url); 

     } 
    }); 
}); 

私は、フォームを、次のURLを取得しています:

https://[S3 BUCKET].s3.ap-south-1.amazonaws.com/[KEY]?X-Amz-Algorithm=[VALUE]&amp;X-Amz-Credential=[VALUE]&amp;X-Amz-Date=20170427T111724Z&amp;X-Amz-Expires=60&amp;X-Amz-Signature=[VALUE]&amp;X-Amz-SignedHeaders=[VALUE] 

しかし、私がしようとするとブラウザでこのリンクを開くと、次のエラーが表示されます。

<Error> 
<Code>AuthorizationQueryParametersError</Code> 
<Message> 
Query-string authentication version 4 requires the X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders, and X-Amz-Expires parameters. 
</Message> 
<RequestId>29819210D89C8877</RequestId> 
<HostId> 
aPpmRMYB7QCog4UDqs1j2rCdY3cy5H8u3kGE8nv2qXF6Y2iATPNquz+MQNdvr3zZ1ceRydRplq0= 
</HostId> 
</Error> 

このエラーが返された理由はわかりませんrlにはすべての必須のクエリパラメータがあります。誰でも助けてもらえますか?

+1

あなたは 's3'オブジェクトをどのように作成したか分かりますか?どの言語を使用していますか? –

+0

@JohnRotenstein私は完全なコードを追加しました。私はNode Expressを使用しています。私がしたいのは、S3に保存されている画像のURLをjavascriptに送り、ウェブページ上に画像を表示することです。 –

+0

URL *は必要なパラメータを持つように*表示されますが、 '&'は存在してはいけません。クエリ文字列パラメータは '&'で区切られており、このxmlエスケープ形式は無効です。それがどこから来ているのかは明らかではありません。 –

答えて

1

Note: You must ensure that you have static or previously resolved credentials if you call this method synchronously (with no callback), otherwise it may not properly sign the request. If you cannot guarantee this (you are using an asynchronous credential provider, i.e., EC2 IAM roles), you should always call this method with an asynchronous callback.

代わりに、メソッドコールバック関数内の署名付きURLを取得するようにしてください。

s3.getSignedUrl('getObject', options, function(err, url) { 
    console.log(url); 
}); 
関連する問題