来自请求体的aws-sdk node.js s3 putObject

时间:2014-08-15 18:43:17

标签: node.js amazon-web-services amazon-s3

我正在尝试使用AWS-SDK将PDF保存到S3中。 我正在通过POST(应用程序/ PDF)的主体获取PDF。

使用fs.writeFile将文件保存到本地HD时,文件看起来没问题。 但是当上传到s3时,文件已损坏(单个白页pdf)

非常感谢任何帮助或提示!

var data = body // body from a POST request.
var fileName = "test.pdf";

fs.writeFile(fileName, data, {encoding : "binary"}, function(err, data) {
    console.log('saved'); // File is OK!
});

s3.putObject({ Bucket: "bucketName", Key: fileName, Body: data }, function(err, data) {
    console.log('uploaded') // File uploads incorrectly.
});

编辑:

如果我写,然后读取文件然后上传它就有效。

fs.writeFile(fileName, data, {encoding : "binary"}, function(err, data) {
    fs.readFile(fileName, function(err, fileData) {
        s3.putObject({ Bucket: "bucketName", Key: fileName, Body: fileData }, function(err, data) {
            console.log('uploaded') // File uploads correctly.
        });
    });
});

4 个答案:

答案 0 :(得分:4)

尝试将put的contentType和/或ContentEncoding设置为S3。

 ContentType: 'binary', ContentEncoding: 'utf8'

请参阅此处的代码示例,了解工作示例putObject makes object larger on server in Nodejs

答案 1 :(得分:3)

我认为这是因为数据被消耗(即流)。

这可以解释为什么在写入数据之后,您不向S3发送任何内容并再次读取数据,您可以发送有效的PDF。

尝试通过直接将数据直接发送到S3而不将其写入磁盘来查看是否有效。

答案 2 :(得分:0)

是的,你忘记了writeFile函数的回调,所以当你开始上传到Amazon S3时,你的文件没有完全保存。您不应该忘记node.js是异步的,并且当fs.writeFile完成它时,应用程序不会等待,它只是同时运行s3.putObject

答案 3 :(得分:0)

/ ** * JS库:来自bluebirdjs的Promise.promisify ** /

我的代码如下

global.Promise = require('bluebird');
const aws = require('aws-sdk');
const aswAccessKey = {
    accessKeyId: 'your-accesskey-id',
    secretAccessKey: 'your-secret-access-key'
};
const fs = require('fs');
const path = require('path');
const uuidV4 = require('uuid/v4');

// Create S3 service object
// available apiVersion: '2006-03-01', '2013-04-01',
const s3 = new aws.S3(Object.assign(aswAccessKey, {
    apiVersion: '2013-04-01'
}));

function putObject(bucketName, file) {
    console.log('putObject into ', bucketName);
    /**
     * If we don't use versioned bucket, we must not pass VersionId
     */
    const params = {
        Bucket: bucketName,
        Key: '',
        Body: 'Plain text',
        ACL: 'public-read',
        ContentType: 'binary',
        CacheControl: 'max-age=172800'
    };

    return Promise
        .promisify(fs.readFile, {
            context: fs
        })(file)
        .then((fileData) => {
            console.log(fileData);
            params.Body = fileData;
            params.Key = 'g01/' + uuidV4() + '-' + path.basename(file);
            return Promise
                .promisify(s3.putObject, {
                    context: s3
                })(params)
                .then((data) => {
                    console.log('successful');
                    console.log(data);
                })
                .catch((err) => {
                    console.log('Error', err);
                });
        })
        .catch(() => {
        });
}