TXT-файл может быть загружен с помощью потоковой передачи на Heroku, но не работает для файлов PDF - NodeJS, Heroku - PullRequest
0 голосов
/ 18 февраля 2020

Я не могу загрузить файл PDF и просмотреть его на Heroku, используя "heroku run bash" . но тот же код работает для TXT-файла на heroku. Принимая во внимание, что этот же код работает для txt и pdf файлов на локальном компьютере.

У меня есть git клон Heroku Nodejs git хранилище (git клон https://github.com/heroku/node-js-getting-started.git) нашел здесь (https://devcenter.heroku.com/articles/getting-started-with-nodejs) и перенес приложение в Heroku.

добавил библиотеки fs и https в проект nodejs.

const express = require('express')
const path = require('path')
var fs = require('fs');
const https = require('https');

const AWS = require('aws-sdk');

AWS.config.loadFromPath('./config.json');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const URL = "<YOUR_URL>";

const PORT = process.env.PORT || 5000

express()
  .use(express.static(path.join(__dirname, 'public')))
  .set('views', path.join(__dirname, 'views'))
  .set('view engine', 'ejs')
  .get('/', (req, res) => res.render('pages/index'))
  .get('/test', function(req,res) {  

    const file = fs.createWriteStream("XXXXXX-pdf.pdf");
    https.get("XXXXX-pdf.pdf", response => {
      var stream = response.pipe(file);

      stream.on("finish", function() {
        console.log("done");

        try{

            // Create params for putObject call
            const objectParams = {
                Bucket: "<YOUR_BUCKET>", 
                Key: "<YOUR_KEY>", 
                ContentLength: headers['content-length'],
                Body: stream
            };
            // Create object upload promise
            await s3.putObject(objectParams).promise();
        } catch(err){
            console.log("ERROR --->" + err)
        }
      });
    });
  })
  .listen(PORT, () => console.log(`Listening on ${ PORT }`))

1 Ответ

0 голосов
/ 19 февраля 2020

"heroku run bash" не может надежно увидеть файл, который был только что загружен, потому что нет гарантии, что он работает на той же самой героине dyno.

Файлы на heroku являются временными, они действуют только как Пока динамо активно, и вы получаете для них ограниченное количество места. Тем не менее, вы можете рассчитывать на то, что они существуют в dyno, который создал их достаточно долго, чтобы завершить sh обработку веб-запроса.

Таким образом, правильное решение - загрузить файл, а затем загрузить его непосредственно в долговременный сервис хранения как Amazon S3. Хотя официальный AWS SDK для Node.js не предоставляет API потоковой передачи для загрузки, это хорошо, потому что вы можете попросить API загрузить только что загруженный файл, все до того, как вы ответите на оригинал. веб-запрос, который вы должны сделать, чтобы правильно завершить его и избежать возможного исчерпания сокета в вашем Node.js приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...