需要路径或链接时将pdf文件传递给函数

时间:2019-05-07 09:03:45

标签: javascript node.js pdf.js pdf-extraction multer-gridfs-storage

我正在为在线图书馆开发Web应用程序。我想从要上传的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 });
  });
});

(为澄清起见,我正在使用带有GridFS的multer将文件上传到猫鼬。

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 });

受Oliver Nybo启发的解决方案

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 个答案:

答案 0 :(得分:1)

根据multer's api documentation,您可以使用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 });
  });
});

编辑:我刚读了multer options,有一个名为preservePath的选项。

  

preservePath-保留文件的完整路径,而不仅仅是基本名称

编辑2:我认为您需要使用gridfs-stream从数据库中提取文件,然后将其转换为缓冲区(例如在this线程中),然后使用PDFExtract的extractBuffer函数。