Загрузить PDF-файлы с внешних ссылок - Heroku, NodeJS, Angular 7 - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь временно загрузить несколько файлов pdf из внешних источников на мой сервер nodejs (в Heroku) и загрузить его в AWS S3 bucket.

Я пробовал несколько методов, каждый из которых отлично работает на моем локальном компьютере, но не на сервере Heroku Dyno NodeJS. Я не могу даже создать папку в Heroku. Я думаю, из-за ограниченного разрешения.

В узле

1) с использованием var download = require ('download-file') (используя это в настоящее время в коде ниже)

2) ax ios

3) res.download ()

Загрузить файлы Код

const downloadFiles = async (unique_files) =>  {

  for (let index = 0; index < unique_files.length; index++) {
    let file_ext = unique_files[index].substr(unique_files[index].length - 4);
      if(file_ext == ".pdf") {
        await downloadzz(unique_files[index])
      }
  }

}

function downloadzz(link) {
  download(link, function(err){ 
    if (err) throw err
    console.log("DOWNLOAD Complete");

  });
}

Загрузить файлы Код

const uploadFiles = async (unique_files) =>  {

  for (let index = 0; index < unique_files.length; index++) {
    let file_ext = unique_files[index].substr(unique_files[index].length - 4);
      if(file_ext == ".pdf") {
        await uploadzz(unique_files[index])
      }
  }
}

function uploadzz(link) {
    fs.readFile(require('path').resolve(__dirname+'/../external-pdfs/', link.slice(link.lastIndexOf('/') + 1)), function (err, data) {

    params = {Bucket: pdfBucket, Key: link.slice(link.lastIndexOf('/') + 1), Body: data, ACL: "public-read" };
    s3.putObject(params, function(err, data) {
        if (err) {
            console.log("Failed Upload", err);
        } else {
            console.log("Successfully uploaded data to bucket", data);
        }
    });

  });
}

Я не получаю никакой ошибки, но, похоже, на сервере heroku папка с именем external-pdfs не существует.

Я открыт для лучших решений: например, для прямой загрузки файла с внешнего URL-адреса в s3 ... Как я могу прочитать файл с внешнего URL-адреса и напрямую загрузить в AWS S3 bucket?

Ответы [ 2 ]

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

Можно использовать топор ios. Задав responseType как stream, вы можете получить данные файла и передать их как тело. Вот пример кода для получения PDF-файла с URL-адреса и загрузки его информации непосредственно на S3:

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

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

const uploadPdfToS3 = async () => {
    try{
        const {data, headers} = await axios.get(URL, {responseType: 'stream'});
        // Create params for putObject call
        const objectParams = {
            Bucket: "<YOUR_BUCKET>", 
            Key: "<YOUR_KEY>", 
            ContentLength: headers['content-length'],
            Body: data
        };
        // Create object upload promise
        await s3.putObject(objectParams).promise();
    } catch(err){
        console.log("ERROR --->" + err)
    }
}
0 голосов
/ 19 февраля 2020

В Angular мы можем использовать библиотеку FileSaver для сохранения файла PDF из библиотеки.

Найдите приведенный ниже пример кода, чтобы сделать это. введите описание изображения здесь

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