无法使用aws-sdk在nodejs中上传图片

5

我尝试使用aws-sdk和knox上传图片时遇到了状态码为301的问题。我收到了状态码为301和消息“您正在尝试访问的存储桶必须使用指定的端点进行访问。请将所有未来请求发送到此端点。这在php中可以工作。

AWS.config.loadFromPath(__dirname + '/config/config.json');
fs.readFile(source, function (err, data) {
var s3 = new AWS.S3();
    s3.client.createBucket({Bucket: 'mystuff'}, function() {
       var d = {
            Bucket: 'mystuff',
            Key: 'img/test.jpg',
            Body: data,
            ACL: 'public-read'
            };
       s3.client.putObject(d, function(err, res) {
            if (err) {
                console.log("Error uploading data: ", err);
                callback(err); 
            } else {
                console.log("Successfully uploaded data to myBucket/myKey");
                callback(res);   
            }
        });
    });
}); 
3个回答

7
我已经解决了这个问题。在您的配置中,必须有一个地区,由于我的存储桶是“美国标准”,我将我的地区留空,并且它起作用了。 config.json - { "accessKeyId": "secretKey", "secretAccessKey": "secretAccessKey", "region": ""}
前往S3管理控制台,选择其中一个文件并单击属性 - >查看文件链接。 美国标准 https://s3.amazonaws.com/yourbucket/ 在控制台窗口中托管 yourbucket.s3.amazonaws.com/
美国西部1区 https://s3-us-west-1.amazonaws.com/yourbucket/ 在控制台窗口中托管 yourbucket.s3-us-west-1.amazonaws.com/

将区域设置为空对我起了作用。 - badunk
我的地区是新加坡,所以将 "region": "ap-southeast-1" 设置为解决了我的问题。谢谢 :-) - Mandeep Singh

5

你尝试使用了 .send() 吗?

我可以使用以下代码上传到 S3。

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/AWSRequest.html

var s3object = {Bucket: 'mystuff', Key: name, Body : data['data']};
    s3.client.putObject(s3object).done(function(resp){
      console.log("Successfully uploaded data");
    }).fail(function(resp){
      console.log(resp);
    }).send();

1
我收到了相同的错误 { code: 'PermanentRedirect', message: '您正在尝试访问的存储桶必须使用指定的端点进行寻址。请将所有未来的请求发送到此端点。', statusCode: 301, retryable: false } - rigaman

0

我在使用新的SDK时遇到了同样的问题,并通过显式设置端点选项来解决它。

参考:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor_details

代码片段:

var AWS = require('aws-sdk'); 

var s3 = new AWS.S3({ endpoint :'https://s3-your-region-varies.amazonaws.com' }),
    myBucket = 'your-bucket-name';

var params = {Bucket: myBucket, Key: 'myUpload', Body: "Test"};

s3.putObject(params, function(err, data) {
    if (err)  {
        console.log(err) 
    } else {
        console.log("Successfully uploaded data to "+myBucket+"/testKeyUpload");
    }
});

或者,您可以通过在配置文件中设置区域来解决此问题,只需确保您的区域名称准确无误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接