¿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
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: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.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
y luego creamos el objeto completo, siendo éste un Buffer binary:Invocación
A continuación, definimos el nodo HTTP Request, para que coja el método y URL del mensaje del nodo previo:Resultado
El flujo quedará de esta manera y podremos ejecutarlo para subir el fichero.
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"]]}]