具有重定向

时间:2018-04-19 10:35:29

标签: node.js amazon-web-services express amazon-s3 aws-lambda

简而言之,我试图通过重定向,aws lambda和aws-sdk来调整图像大小。

按照使用AWS AWS - resize-images-on-the-fly动态调整图像大小的教程,我已经设法根据演练使一切正常工作,但是我的问题与调用存储桶有关

目前我能让这个工作的唯一方法是打电话, http://MY_BUCKET_WEBSITE_HOSTNAME/25×25/blue_marble.jpg

如果图像不可用,则会重定向请求,调整图像大小,然后将其放回存储桶中。

我想做的是通过s3.getObject()调用访问aws-sdk中的存储桶,而不是直接链接。

截至目前,我只能访问当前位于存储桶中的图像,因此重定向永远不会发生。

我的想法是请求没有被发送到正确的端点,并且从我在网上找到的,我改变了创建sdk的方式 -

s3 = new aws.S3({ accessKeyId: "myAccessKeyId", secretAccessKey: "mySecretAccessKey", region: "us-west-2", endpoint: '<MYBUCKET>.s3-website-us-west-2.amazonaws.com', s3BucketEndpoint: true, sslEnabled: false, signatureVersion: 'v4' }) params = { Bucket: 'MY_BUCKET', Key: '85x85/blue_marble.jpg' }; s3.getObject(params, (error, data) => data);

从我可以告诉请求中的端点看起来是正确的。 request endpoints

当我直接在浏览器中访问端点时,一切都按预期工作。

但是在使用sdk时,只返回可用的图像。没有重定向,没有数据返回,我收到错误。

  

XMLParserError:第一个标记之前的非空格。

不确定是否可以使用s3.getObject(),似乎可能,但我似乎无法弄明白。

1 个答案:

答案 0 :(得分:0)

使用headObject检查对象是否存在。如果没有,您可以调用您的API进行调整大小&amp;然后在调整大小后重试get。

var params = {
    Bucket: config.get('s3bucket'),
    Key: path
};

s3.headObject(params, function (err, metadata) {  
  if (err && err.code === 'NotFound') {  
    // Call your resize API here. Once your resize API returns a success, you can get the object\URL.
  } else {  
    s3.getSignedUrl('getObject', params, callback); //Use this secure URL to access the object.
 }
});