Загрузка PDF в AWS S3 повреждена

Мне удалось загрузить сгенерированный PDF-файл на s3 с моего узла JS-сервера. Pdf выглядит нормально в моей локальной папке, но когда я попытался получить к нему доступ из консоли AWS, он показывает «Не удалось загрузить PDF-документ».

Я попытался загрузить его через API s3.upload и s3.putObject (для putObject я также использовал средство проверки .on Finish, чтобы убедиться, что файл был полностью загружен перед отправкой запроса). Но файл в ведре S3 все тот же (маленький) размер, 26 байт и не может быть загружен. Любая помощь приветствуется!!!

    var pdfDoc = printer.createPdfKitDocument(inspectionReport);
    var writeStream = fs.createWriteStream('pdfs/inspectionReport.pdf');
    pdfDoc.pipe(writeStream);
    pdfDoc.end();
    writeStream.on('finish', function(){
        const s3 = new aws.S3();
        aws.config.loadFromPath('./modules/awsconfig.json');

    var s3Params = {
        Bucket: S3_BUCKET,
        Key: 'insp_report_test.pdf',
        Body: '/pdf/inspectionReport.pdf',
        Expires: 60,
        ContentType: 'application/pdf'
    };
    s3.putObject(s3Params, function(err,res){
        if(err) 
            console.log(err);
        else
            console.log(res);
    })

person jlyh    schedule 25.07.2016    source источник
comment
откройте файл в текстовом редакторе и посмотрите, что это за сообщение - скорее всего оно говорит вам об ошибке   -  person Frederic Henri    schedule 25.07.2016
comment
Я так понимаю, файл должен быть больше 26 байт. Строка console.log(res); в вашем коде выполняет и печатает что-нибудь? Похоже, ваше приложение закрывается до завершения вызова s3.putObject().   -  person Mark B    schedule 25.07.2016
comment
Body: '/pdf/inspectionReport.pdf', Сколько байтов в строке /pdf/inspectionReport.pdf? Похоже на 26. Body ожидает body, а не путь.   -  person Michael - sqlbot    schedule 26.07.2016
comment
Michael-sqlbot Думаю, вы правы. Я открыл копию скачанного файла на своем компьютере с помощью блокнота, и там написано «/pdf/inspectionReport.pdf». Однако, когда я заменил значение для Body: pdfDoc, AWS API выдает ошибку — [Ошибка: невозможно определить длину [объекта PDFDocument]]. Как я могу передать тело pdf? Кроме того, я полагаю, что даже если в моем теле есть только строка «/pdf/inspectionReport.pdf», у меня должен быть правильный PDF-файл, сохраненный в моей корзине S3, который читает эту строку, а не файл, который не может быть загружен. Может быть, это вообще 2 разные проблемы?   -  person jlyh    schedule 26.07.2016
comment
@jlyh ты решил проблему ?? пожалуйста, поделитесь с нами   -  person nur farazi    schedule 01.08.2016
comment
@nurfarazi Нет, мне еще не удалось решить эту проблему, и я решил обойти проблему в интересах времени. При этом я сохранил всю информацию, необходимую для создания pdf-файла, и когда это требовалось для извлечения документа, я генерировал pdf-файл на стороне клиента для загрузки. Мне все еще было бы интересно решить эту проблему, если вы сможете найти решение! :)   -  person jlyh    schedule 02.08.2016
comment
@nurfarazi Мне удалось решить эту проблему, см. ответ ниже.   -  person jlyh    schedule 09.08.2016


Ответы (1)


Я понял, что pdfDoc.end() должен появиться до начала конвейера. Также использовали обратный вызов, чтобы гарантировать, что загрузка s3 вызывается после завершения записи pdf. Смотрите код ниже, надеюсь, это поможет!

var pdfDoc = printer.createPdfKitDocument(inspectionReport);
pdfDoc.end();    

async.parallel([

        function(callback){
            var writeStream = fs.createWriteStream('pdfs/inspectionReport.pdf');
            pdfDoc.pipe(writeStream);
            console.log('pdf write finished!');
            callback();
        }

    ], function(err){

        const s3 = new aws.S3();
        var s3Params = {
            Bucket: S3_BUCKET,
            Key: 'insp_report_test.pdf',
            Body: pdfDoc,
            Expires: 60,
            ContentType: 'application/pdf'
        };

        s3.upload(s3Params, function(err,result){
            if(err) console.log(err);
            else console.log(result);
        });
    }
);
person jlyh    schedule 09.08.2016