web-dev-qa-db-fra.com

AWS Lambda ne parvient pas à renvoyer le fichier PDF

J'ai créé une fonction lambda en utilisant sans serveur . Cette fonction est déclenchée via API Gateway sur une demande GET et doit renvoyer un fichier pdf à partir d'un tampon. J'utilise html-pdf pour créer le tampon et j'essaye de retourner le fichier pdf avec la commande suivante

  let response = {
    statusCode: 200,
    headers: {'Content-type' : 'application/pdf'},
    body: buffer.toString('base64'),
    isBase64Encoded : true,
  };
  return callback(null, response);

mais le navigateur ne parvient tout simplement pas à charger le pdf, donc je ne sais pas exactement comment retourner le fichier pdf directement au navigateur. Impossible de trouver une solution à cela.

9
sami_analyst

eh bien, j'ai trouvé la réponse. Les paramètres de mon objet de réponse sont corrects, je devais juste modifier manuellement les paramètres dans API Gateway pour que cela fonctionne dans le navigateur. J'ai ajouté "*/*" aux types de supports binaires sous les paramètres binaires dans la console API Gateway

API GATEWAY

  1. connectez-vous simplement à votre console
  2. choisissez votre api
  3. cliquez sur le support binaire dans la liste déroulante
  4. modifier le type de support binaire et ajouter "*/*"

L'EXTRÉMITÉ AVANT

ouvrir l'url de l'API dans un nouvel onglet (target = "_ blank"). Le navigateur gère probablement la réponse codée en base 64. Dans mon cas avec Chrome, le navigateur ouvre simplement le pdf dans un nouvel onglet exactement comme je le veux.

15
sami_analyst

Après avoir passé plusieurs heures sur ce sujet, j'ai découvert que si vous définissez Content handling Sur Convert to binary (CONVERT_TO_BINARY), la réponse entière doit être en base64, sinon j'obtiendrais une erreur: Unable to base64 decode the body .

Par conséquent, ma réponse ressemble maintenant à:

callback(null, buffer.toString('base64'));

La réponse d'intégration:

enter image description here

La réponse de la méthode:

enter image description here

Et les types de supports binaires:

enter image description here

9
teocomi

Si vous avez un gigantesque PDF, alors Lambda mettra longtemps à le renvoyer et dans Lambda, vous êtes facturé aux 100 ms.

Je l'enregistrerais d'abord sur S3, puis je laisserais la Lambda renvoyer l'URL S3 au client pour téléchargement.

6
dashmug

La solution ci-dessus est uniquement pour un type de contenu particulier. Vous ne pouvez plus de type de contenu. Suivez uniquement les étapes ci-dessous en deux étapes pour résoudre plusieurs problèmes de type de contenu.

  1. Cliquez sur la case à cocher Utiliser l'intégration du proxy Lambda

Passerelle API -> API -> méthode -> demande d'intégration

enter image description here

enter image description here

  1. Créez votre réponse en tant que

    laissez réponse = {

          statusCode: 200,
          headers: {
            'Content-type': 'application/pdf',//you can change any content type
            'content-disposition': 'attachment; filename=test.pdf' // key of success
          },
          body: buffer.toString('base64'),
          isBase64Encoded: true
        };
        return response;
    

Remarque * - Ce n'est pas sécurisé

0
Prashant Tapase