nodejs将pdf上载到S3存储桶损坏的文件

时间:2018-07-22 23:13:41

标签: node.js pdf amazon-s3 aws-sdk aws-sdk-nodejs

我目前正在使用aws-sdk将pdf文件上传到存储桶S3,如下所示:

function uploadFile (filePath, remoteFilename, cb) {
    var fileBuffer = fs.createReadStream(filePath); // ex.: 'temp/longFileName.pdf'
    fileBuffer.on('error', function(err) {
        logger.warn('Failed reading local pdf file');
        cb(err);
    });
    s3.upload({
        Bucket: 'someBucketName',
        Key: remoteFilename,
        Body: fileBuffer
    }, function (error, response) {
        cb(error, { response, remoteFilename });
    });
}

问题在于,有时文件以0B大小上传,有时文件以正确大小上传,但是当我下载文件时,文件已损坏,当然有时文件正确上传并可以正确打开。

我从系统文件本地读取了pdf文件,并且该pdf文件正确。

有人可以帮我解决此问题吗?

更新

我正在使用pdfkit创建pdf:

function createPdf (data, cb) {
    var fs = require('fs');
    var PDFDocument = require('pdfkit');
    var filePath = 'temp/longFileName.pdf';
    var pdf = new PDFDocument({
      size: 'LEGAL',
      info: {
        Title: 'Tile of File Here',
        Author: 'Some Author',
      }
    });

    // Write stuff into PDF
    pdf.text('Hello World');

    // Stream contents to a file
    pdf.pipe(
      fs.createWriteStream(filePath)
    )
      .on('finish', function () {
        console.log('PDF closed');
      });

    // Close PDF and write file.
    pdf.end();
    cb(null, {filePath})
}

一旦调用了此函数中的回调,我就会调用uploadFile函数:

function doAll (someData, cb) {

    createPdf(someData, function(err, data) {
        if (err) console.log(err)

        uploadFile(data.filePath, function(err,data) {
            if (err) console.log(err)
            console.log('finished')
            cb(null, 'done');
            return;
        })
    })
}

1 个答案:

答案 0 :(得分:2)

问题是您要立即调用回调,而不是等待文件完全写入。您的回调函数应位于.on('finish')

内部
pdf.pipe(
  fs.createWriteStream('./path/to/file.pdf')
)
.on('finish', function () {
    console.log('PDF closed');
    cb(null, 'finished'); // The callback should e in here
});

// Close PDF and write file.
pdf.end();