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
。
- 使用强大的和(knox或aws-sdk)在Node.js上传文件到S3
- 如何使用nodejs将图像上传到s3时设置过期date
- 如何使用AWS SDK for Node.js将Amazon S3中的所有对象从一个前缀复制/移动到另一个前缀
- 从Amazon S3直接将文件stream式传输到客户端(Node.js)
- 寻找node.js模块为不同的存储提供者提供统一的文件API
- 节点应用程序stream文件直接上传到amazon s3
- TypeError:不是缓冲区node.js crypto,aws-sdk
- 如何纯粹使用Cognito来authentication用户使用S3
- Amazon S3 – 编辑上传的图像