¿Cómo subir un fichero vía petición HTTP Request?

¿Cómo subir un fichero vía petición HTTP Request?

Introducción

En muchos casos en necesario hacer peticiones POST con ficheros multipart y en este ejemplo vamos a ver cómo hacerlo. Como ejemplo subiremos un fichero json a nuestro repositorio de ficheros, aunque funcionaría de igual manera para cualquier servicio que está esperando la subida de un fichero.

Cómo desarrollarlo

  1. Obtener los datos del fichero en cuestión

    Es posible que el fichero lo tengamos que generar al vuelo o lo tengamos ya cargado en el mensaje previamente. Lo fundamental es que dicho contenido sea un Buffer binario. En este ejemplo vamos a generar el contenido del fichero a partir de un JSON válido desde un String.

    Para ello, en un nodo “function” creamos el JSON String y lo pasamos a Buffer binnary:


    image-20240312-091408.png



  2. Preparación de la llamada

    Vamos a hacer uso de la API de Gestión de Plataforma para subida de ficheros. En nuestro caso tendremos que definir la URL, método y las cabeceras.


    image-20240312-092837.png

     

  3. Preparación del Multipart

    Para poder subir el fichero, tendremos que montar el Multipart a mano.

    Primero establecemos la definición del ContentType a multipart en las cabeceras

    image-20240312-092917.png


    y luego creamos el objeto completo, siendo éste un Buffer binary:


    image-20240312-092041.png

     

  4. Invocación

    A continuación, definimos el nodo HTTP Request, para que coja el método y URL del mensaje del nodo previo:

    image-20240312-092148.png

  5. Resultado

    El flujo quedará de esta manera y podremos ejecutarlo para subir el fichero.

    image-20240312-092343.png

A continuación puedes te dejamos este ejemplo para que puedas importarlo y probarlo:

 

[{"id":"d8595d192abf4955","type":"tab","label":"Flow 6","disabled":false,"info":"","env":[]},{"id":"1ede2a06b2344b9c","type":"function","z":"d8595d192abf4955","name":"Prepare POST","func":"\nmsg.payload ='[{\"result\":{\"value\":3,\"device\":\"device1\"}},{\"result\":{\"value\":8,\"device\":\"device2\"}}]';\nlet content = Buffer.from(msg.payload, 'binary');\n\nmsg.url = \"http://controlpanelservice:18000/controlpanel/binary-repository?metadata=&repository=MONGO_GRIDFS\";\nmsg.method = \"POST\";\n\nmsg.headers = {\n \"Content-Type\": \"multipart/form-data; boundary=------------------------d74496d66958873e\",\n \"X-OP-APIKey\": \"<insertYourTokenHere>\"\n}\nmsg.filename = \"myFile.json\"\nlet stringHeader = '--------------------------d74496d66958873e\\r\\n' +\n 'Content-Disposition: form-data; name=\"select\"\\r\\n' +\n '\\r\\n' +\n 'true\\r\\n' +\n '--------------------------d74496d66958873e\\r\\n' +\n 'Content-Disposition: form-data; name=\"print\"\\r\\n' +\n '\\r\\n' +\n 'true\\r\\n' +\n '--------------------------d74496d66958873e\\r\\n' +\n 'Content-Disposition: form-data; name=\"file\"; filename=\"' + msg.filename + '\"\\r\\n' +\n 'Content-Type: image/png\\r\\n' +\n '\\r\\n';\nlet stringFooter = '\\r\\n' +\n '--------------------------d74496d66958873e--\\r\\n';\n// Los datos vienen en binario, por lo que hay que ponerlo todo en el mismo formato. \n// Es mejor trabajar con Buffers ya que nodejs usa unicode y utf-16 para los strings.\nlet header = Buffer.from(stringHeader, 'binary');\nlet footer = Buffer.from(stringFooter, 'binary');\n// Concatenamos el header y el footer a los datos que nos llegan.\nlet datos = Buffer.concat([header, content, footer])\nmsg.payload = datos;\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":240,"wires":[["e877399494e0ad0e"]]},{"id":"86461cc276538dd0","type":"inject","z":"d8595d192abf4955","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":300,"y":240,"wires":[["1ede2a06b2344b9c"]]},{"id":"2cdac17babe5dbea","type":"debug","z":"d8595d192abf4955","name":"Result debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":850,"y":300,"wires":[]},{"id":"e877399494e0ad0e","type":"http request","z":"d8595d192abf4955","name":"UPLOAD FILE","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":620,"y":300,"wires":[["2cdac17babe5dbea"]]}]