aws-sdk node.js s3 putObject从请求体

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

使用fs.writeFile将文件保存到本地HD时,文件看起来OK。 但是当上传到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. }); }); }); 

尝试设置您的put到S3的contentType和/或ContentEncoding。

  ContentType: 'binary', ContentEncoding: 'utf8' 

在这里查看代码示例以查看工作示例putObject使Nodejs中的服务器上的对象变大

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

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

试着看看它是否可以直接发送数据到S3而不写入磁盘。

/ ** * 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(() => { }); } 

是的,您忘记了writeFile函数的callback,所以当您开始上传到Amazon S3时,您的文件并未完整保存。 你不应该忘记,node.js是asynchronous的,当fs.writeFile完成工作时,应用程序不会等待,它只是同时运行s3.putObject