无法在Node.js中使用aws-sdk加载PDF文档

时间:2017-11-24 14:47:43

标签: javascript node.js amazon-s3 aws-sdk

将pdf文件上传到S3时出现问题。

使用PDFkit创建pdf文件并将其存储在本地(我可以在浏览器中查看)没有问题。

但是当我尝试将它们上传到我的S3存储空间时,在浏览器中打开pdf时出现此错误无法加载PDF文档。。你可以看一下: https://s3.us-east-2.amazonaws.com/pdf-twitter-bucket/twitter/HvkH98YA0p.pdf

        fs.readFile('../pdf/' + fileName, 'utf8', function (err, contents) {
          const buf = new Buffer(contents, 'base64');
          // define params
          const params = {
            Bucket: 'pdf-twitter-bucket',
            Key: 'twitter/' + fileName,
            Body: buf,
            ContentType: 'application/pdf',
            ACL: 'public-read'
          };

          s3bucket.upload(params, function (err) {
            if (err) {
              console.log('error in callback');
              console.log(err);
            }
            res.end(
              'https://s3.us-east-2.amazonaws.com/pdf-twitter-bucket/twitter/' +
              fileName
            ); // send the link to s3
          });
        });

我尝试了很多选择: 1)使用Buffeer而不使用Buffer 2)上传.txt文件没有问题 3)我甚至尝试将字符串作为Body

传递

在写这个问题之前,我进行了一项小型研究,发现了类似的问题:

https://github.com/VeliovGroup/Meteor-Files/issues/406

不幸的是,它对我帮助不大......

2 个答案:

答案 0 :(得分:2)

我上传了S3相同的问题。我无法打开PDF,它的大小只有几个字节(而不是几KB)。我认为问题在于我没有等待写流完成。

现在这对我有用:



document.pipe(fs.createWriteStream(fileName));
document.end();
document.on('end', function () {
  fs.readFile(fileName, function (err, data) {
    if (err) {
      console.log(err);
    }
    s3.upload({
      Bucket: s3Bucket,
      Key: fileName,
      Body: data,
      ContentType: 'application/pdf',
      acl: 'private',
      contentDisposition: 'attachment',
      ServerSideEncryption: 'AES256'
    }, function(err, data) {
      if (err) {
        console.log(err);
      }
    });
  });
});




希望这有帮助!

答案 1 :(得分:0)

回答为时已晚。 但是,如果有人来到这个页面,我会回答他/她会采取正确的方法。

我制作了一个可以在任何文件中完美运行的git。https://gist.github.com/sarfarazansari/59d5cf4bb3b03acf069396ca92a79b3e