正确的代码将本地文件上传到API网关的S3代理

时间:2017-09-24 16:20:32

标签: amazon-s3 aws-api-gateway

我创建了一个API函数来使用S3。我导入了模板招摇。部署之后,我通过npm模块aws-api-gateway-client测试了Node.js项目。

它适用于:获取存储桶列表,获取存储桶信息,获取一个项目,放入存储桶,放置纯文本对象,但是我被阻止放入二进制文件。

首先,我确保ACL具有S3上的所有权限。其次,二进制支持也增加了 图像/ GIF application / octet-stream

enter image description here

代码段如下。行为是:

1)在invokeAPI之后,回调函数永远不会被命中,经过一段时间后,Node.js项目没有响应。没有任何错误消息。文件大小(例如图像)非常小。 2)只有两次,上传似乎有效,但结果文件大小比原始文件大(大约2M),因此文件已损坏。

你可以帮帮我吗?谢谢!

var filepathname = './items/';
var filename = 'image1.png';

fs.stat(filepathname+filename, function (err, stats) {

    var fileSize = stats.size ;

    fs.readFile(filepathname+filename,'binary',function(err,data){ 

        var len = data.length;
        console.log('file len' + len);

        var pathTemplate = '/my-test-bucket/' +filename ; 
        var method = 'PUT';

        var params = {
            folder: '',
            item:''
        };
        var additionalParams = {
            headers: {
             'Content-Type': 'application/octet-stream',
              //'Content-Type': 'image/gif',
             'Content-Length': len
           }
        };

        var result1 = apigClient.invokeApi(params,pathTemplate,method,additionalParams,data) 
        .then(function(result){
            //never hit :(
            console.log(result);
         }).catch( function(result){
              //never hit :(
             console.log(result);
        });;

    }); 

});

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题。 API网关适用于有限的数据(截至目前为10MB),此处显示限制

http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

自签名到S3的网址:

从lambda或您尝试发布的端点为POST创建一个S3自签名URL。

How do I put object to amazon s3 using presigned url?

现在将图像直接发布到S3。

Presigned POST:

如果您想发布其他属性,除了发布图片外,您也可以将其发布为多格式格式。

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createPresignedPost-property

如果要在传送到S3后处理文件,可以在创建时使用S3创建触发器,并使用您的Lambda或需要处理的任何点进行处理。

希望它有所帮助。