request-promise download pdf file

17,832

Solution 1

Add encoding: 'binary' to your request options:

const optionsStart = {
  uri: url,
  method: "GET",
  encoding: "binary", // it also works with encoding: null
  headers: {
    "Content-type": "application/pdf"
  }
};

Solution 2

Add encoding: null to your request options:

const optionsStart = {
  uri: url,
  method: "GET",
  encoding: null,
  headers: {
    "Content-type": "application/pdf"
  }
};

Then, turn the response into a Buffer (if necessary):

const buffer = Buffer.from(response);

Solution 3

try this

const optionsStart = {
      uri: url,
      method: 'GET',
      headers: {
          'X-TOKEN': authToken,
          'Content-type': 'application/pdf'
      },
      encoding: null
  }
  request(optionsStart, (err, resp) => {
      let writeStream = fs.createWriteStream(uuid + '_obj.pdf');
      writeStream.write(resp.body, 'binary');
      writeStream.on('finish', () => {
        console.log('wrote all data to file');
      });
      writeStream.end();
  })
Share:
17,832

Related videos on Youtube

Ckappo
Author by

Ckappo

Updated on September 16, 2022

Comments

  • Ckappo
    Ckappo over 1 year

    I received multiple pdf files and must download it from a REST-API.

    After auth and connect I try to download the file with request-promise:

    const optionsStart = {
      uri: url,
      method: 'GET',
      headers: {
          'X-TOKEN': authToken,
          'Content-type': 'applcation/pdf'
        }
      }
      request(optionsStart)
        .then(function(body, data) {
          let writeStream = fs.createWriteStream(uuid+'_obj.pdf');
          console.log(body)
          writeStream.write(body, 'binary');
          writeStream.on('finish', () => {
            console.log('wrote all data to file');
          });
          writeStream.end();
        })
    

    The request create a pdf (approximately 1-2MB) but I can't open it. (Mac Preview show blank pages and adobe show = >

    There was an error opening this document. There was a problem reading this document (14).

    I have no information about the API Endpoint where I download the files. Just have this curl:

    curl -o doc.pdf --header "X-TOKEN: XXXXXX" 
    http://XXX.XXX/XXX/docs/doc1
    

    Where is my mistake?

    Update:

    I opened the file in edit and the file looks like that: file preview

    Don't have any experience with that :-)

  • Bora M. Alper
    Bora M. Alper about 6 years
    If encoding: "binary" doesn't work try encoding: null!
  • Manohar Reddy Poreddy
    Manohar Reddy Poreddy almost 6 years
    @boramalper I had excel sheet (.xlsx), null worked perfectly, thank you a lot!
  • TadeoArmenta
    TadeoArmenta over 5 years
    @BoraM.Alper null works perfect with encryption keys on .dat format
  • Ben McCann
    Ben McCann about 5 years
    If you set encoding: null then you do not need to do Buffer.from(response) since the response will already be a buffer