Search code examples
node.jsapiexpressfile-upload

Uploading a File by Path - DocParser API


So am I currently trying to Upload a file to parser using the DOCPARSER API, however whenever I try to upload the file I just get a response that states the "received contents have 0 bytes". The file currently uploads to the "uploads" directory fine for now, also here is the API documentation: https://github.com/Docparser/Docparser-Node

const express = require('express');
const path = require('path');
const docparser = require('docparser-node');
const client = new docparser.Client("API KEY");
const fileUpload = require('express-fileupload');


const app = express();

app.use(fileUpload());

// Upload Endpoint
app.post('/upload', (req, res) => {
  if (req.files === null) {
    return res.status(400).json({ msg: 'No file uploaded' });
  }

  const file = req.files.file;


  console.log(file);


  file.mv(`${__dirname}/../client/public/uploads/${file.name}`, err => {
    if (err) {
      console.error(err);
      return res.status(500).send(err);
    }

    res.json({ fileName: file.name, filePath: `/uploads/${file.name}` });
  });



  client.uploadFileByPath('cslfmvewjrvo', `${__dirname}/../client/public/uploads/${file.name}`)
  .then(function (result) {
    // => {"id":"document_id","file_size":198989,"quota_used":16,"quota_left":34,"quota_refill":"1970-01-01T00:00:00+00:00"}
    promise.resolve(console.log(result));
  })
  .catch(function (err) {
    console.log(err)
  })

});

app.listen(3000, () => console.log('Server Started...'));


Solution

  • Seems that your problem was a syncronous one... Your client block was expecting a file but you can't guarantee that file.mv is ready, so I did some modifications and using multer instead of fileUpload and other method of DocParser for upload uploadFileByStream:

    const express = require('express');
    const docparser = require('docparser-node');
    const client = new docparser.Client("CLIENT_ID");
    
    const multer = require('multer');
    
    const storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, 'uploads/')
      },
      filename: function (req, file, cb) {
        cb(null, file.originalname)
      }
    })
    
    const upload = multer({ storage });
    
    const fs = require('fs')
    
    
    const app = express();
    
    // Upload Endpoint
    app.post('/upload', upload.single('file'), (req, res) => {
      if (req.file === null) {
        return res.status(400).json({ msg: 'No file uploaded' });
      }
    
      const file = req.file;
    
      console.log(`${__dirname}/uploads/${file.filename}`);
    
      client.uploadFileByStream('PARSE_ID', fs.createReadStream(`${__dirname}/uploads/${file.filename}`))
        .then(function (result) {
          Promise.resolve(console.log(result));
        })
        .catch(function (err) {
          console.log(err.stack)
        })
    
      res.json({ fileName: file.name, filePath: `/uploads/${file.filename}` });
    
    });
    
    app.listen(3000, () => console.log('Server Started...'));