Estoy tratando de agregar algunos archivos (documentos de identidad) a la banda para crear una cuenta conectada, pero tengo problemas para cargarlos desde el lado del cliente a la banda. Mi backend está en Node.js y la documentación de Stripe dice que debería usar este formato:
const Stripe = require('stripe'); const stripe = Stripe('stripeAPIKEY'); var fp = fs.readFileSync('/path/to/a/file.jpg'); var file = await stripe.files.create({ purpose: 'identity_document', file: { data: fp, name: 'file.jpg', type: 'image/jpg', }, });Necesito cargar los datos del archivo (la variable fp), pero parece que no puedo obtener la ruta relevante para cuando el usuario cargue su documento en el lado del cliente en Javascript. Aquí está mi llamada de función a Stripe:
export const uploadPersonIdFile = async (identityDocument: any) => { const fp = fs.readFileSync(identityDocument); const personId = await stripe.files.create({ purpose: 'identity_document', file: { data: fp, name: 'idDocument.jpg', type: 'image/jpg', }, }); return personId; }Mi lado del cliente se ve así:
const inpFileU = $("#utilityButton"); const previewImage = $("#image-preview__image-U"); const previewDefaultText = $("#image-preview__default-text-U"); inpFileU.change(function(){ const file = this.files[0]; if(file){ const reader = new FileReader(); previewImage.css("display", "block"); reader.addEventListener("load", function(){ previewImage.attr("src", this.result); }); reader.readAsDataURL(file); utilityFileName = file.name; await uploadMerchantUtilityDocument({ utilityDocument: utilityFileName }).then((result) => { /** @type {any} */ const data = result.data; const textData = data.text; console.log(JSON.stringify(data)); console.log(JSON.stringify(textData)); }).catch((error) => { console.log("Error message: " + error.message); console.log("Error details: " + error.details); }); } else { console.log('no file'); } });Subo el archivo y luego la respuesta del mensaje de error que recibo es esta: Error: ENOENT: no existe tal archivo o directorio, abra 'insuranceImage.jpeg'
¿Cómo debo subir mi archivo? Creo que mi variable fp está mal, pero no sé con qué reemplazarla
Por lo que entendí, está cargando archivos desde el cliente al servidor y desde el servidor que desea cargar a la API de stripe. En este caso, cuando lee un archivo con la codificación predeterminada fs es utf8 pero tal vez cuando el archivo se cargó estaba codificado como base64. No sé mucho sobre jquery. Compruebe cómo se codificó, así que utilice la codificación correcta.
const image= fs.readFileSync('/path/to/file.jpg', {encoding: 'base64'}); Creo que de alguna manera la imagen está rota. Si la ruta de la imagen es correcta, simplemente coloque manualmente una imagen en ese directorio y luego léala como codificación utf8 .
ya que obtuvo este error, la base64 string is too large to process in fs.readFileSync , lo que significa que su ruta es correcta.
reader = fs.createReadStream('imagePath', { flag: 'a+', // then try this to base64 encoding: 'UTF-8', start: 5, end: 64, highWaterMark: 16 }); // Read and display the file data on console reader.on('data', function (chunk) { console.log(chunk); });Según el error y el comentario, parece que la ruta que está proporcionando a readFileSync no apunta a dónde existe el archivo que está tratando de leer. Por el error, parece que está pasando insuranceImage.jpeg y que el sistema no puede encontrar ese archivo.
Intente confirmar si la ruta relativa que está proporcionando es correcta, o construya y proporcione una ruta absoluta en su lugar.
Ok, después de un tiempo, un profesional en línea me ayudó. Esto es lo que hizo (porque la documentación de Stripe no es muy buena para cargar archivos)...
Creé una variable base64 de FileReader(), que provino de la creación de una matriz base64String = [] Esta matriz se apoderó del resultado de reader.load, así:
reader.addEventListener("load", function(){ base64String.push(this.result); });Esta matriz base64String luego se usó como la variable IdentityDocument para la función de back-end.
Así que mi variable base64 en el lado del cliente siguió comenzando con 'image/jpeg; base64', y necesitaba deshacerme de eso. No tiene sentido usar fs.readFileSync ya que no estamos cargando un archivo en la banda, estamos cargando datos base64 sin procesar. Entonces, el siguiente código en node.js encaja bien para resolver esto:
const parts = utilityDocument.split(","); const base64 = parts[1]; const buffer = Buffer.from(base64, "base64");entonces la función completa que llama a stripe es así:
export const uploadPersonIdFile = async (uid: any, identityDocument: any) => { const parts = identityDocument.split(","); const base64 = parts[1]; const buffer = Buffer.from(base64, "base64"); const personId = await stripe.files.create({ purpose: 'identity_document', file: { data: buffer, name: 'identity.jpg', type: 'image/jpg', }, }); await updateMerchantId(uid, { idDocument: personId.id }); return personId; }