我正在尝试使用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.
});
});
});
答案 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(() => {
});
}