Передача pdf-файла в функцию, когда требуется путь или ссылка - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над веб-приложением для онлайн-библиотеки. Я хочу извлечь метаданные из PDF-файлов, которые будут загружены, и для этого я использую библиотеку nodejs pdf.js-extract и multer-gridfs-storage для загрузки. Проблема в том, что я получаю файл PDF (req.file), и функция требует путь или ссылку на файл PDF и, следовательно, показывает ошибку

"TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be one of type string, Buffer, or URL. Received type object"

Я хотел бы знать, есть ли способ передать файл в виде ссылки, временно сохранить файл локально или найти другую библиотеку, которая соответствует моим потребностям.

Это мой текущий код.

const PDFExtract  = require('pdf.js-extract').PDFExtract;

app.post('/upload', upload.single('file'), (req, res) => {
  const pdfExtract = new PDFExtract();
  const options = {};

  pdfExtract.extract(req.file, options, (err, data) => {
      if (err){
        res.status(404).send({ message: err });
      }
      res.status(200).send({ message: data });
  });
});

(Изменить для уточнения) Я использую multer с gridFS для загрузки файла в mongoose.

const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');

// Create storage engine
const storage = new GridFsStorage({
  url: mongoURI,
  file: (req, file) => {
    return new Promise((resolve, reject) => {
      crypto.randomBytes(16, (err, buf) => {
        if (err) {
          return reject(err);
        }
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
          filename: filename,
          bucketName: 'uploads'
        };
        resolve(fileInfo);
      });
    });
  }
});
const upload = multer({ storage });

Решение, вдохновленное Оливером Найбо

app.post('/upload', upload.single('file'), (req, res) => {
  const pdfExtract = new PDFExtract();
  const options = {};

  var readableStream = gfs.createReadStream({ filename : req.file.filename });
  var buff;

  var bufferArray = [];
  readableStream.on('data',function(chunk){  
      bufferArray.push(chunk);
  });
  readableStream.on('end',function(){
      var buffer = Buffer.concat(bufferArray);
      buff=buffer;
      pdfExtract.extractBuffer(buff, options, (err, data) => {
        if (err) {
          res.status(404).send({ message: err });
        }
        res.status(200).send({ message: data });
      });
  })
});

1 Ответ

1 голос
/ 07 мая 2019

Согласно документации API multer , вы можете использовать req.file.path, чтобы получить полный путь к загруженному файлу.

const PDFExtract  = require('pdf.js-extract').PDFExtract;

app.post('/upload', upload.single('file'), (req, res) => {
  const pdfExtract = new PDFExtract();
  const options = {};

  pdfExtract.extract(req.file.path, options, (err, data) => {
      if (err){
        res.status(404).send({ message: err });
      }
      res.status(200).send({ message: data });
  });
});

Редактировать: Я только что прочитал параметры мультиплеера , и есть опция под названием preservePath.

preservePath - Сохраните полный путь к файлам вместо базового имени

Редактировать 2: Я думаю, вам нужно извлечь файл из базы данных с помощью gridfs-stream , а затем преобразовать его в буфер (как в this ), а затем используйте функцию PDFExtract extractBuffer.

...