Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

156
Views
Texto -> PNG -> ReadStream, ¿todo hecho en el front-end?

No estoy seguro de si esto es posible, pero esto es lo que estoy tratando de hacer:

  1. Permitir que el usuario ingrese algún texto
  2. Genera un PNG a partir de ese texto.
  3. Subirlo a Pinata, lo que requiere que esté en formato ReadStream
  4. Haz todo esto en el front-end

Logré lograr (1) y (2) usando html2canvas .

La parte difícil es (3). La razón por la que tiene que estar en formato ReadStream es porque ese es el formato que quiere el SDK de Pinata :

 const fs = require('fs'); const readableStreamForFile = fs.createReadStream('./yourfile.png'); const options = { pinataMetadata: { name: MyCustomName, keyvalues: { customKey: 'customValue', customKey2: 'customValue2' } }, pinataOptions: { cidVersion: 0 } }; pinata.pinFileToIPFS(readableStreamForFile, options).then((result) => { //handle results here console.log(result); }).catch((err) => { //handle error here console.log(err); });

Me doy cuenta de que no sería un problema hacerlo en el backend con el nodo, pero me gustaría hacerlo en el front-end. ¿Es eso posible? ¿O estoy loco?

Estoy usando específicamente Vue si eso importa.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Para cualquier persona interesada, la solución terminó siendo usar fetch+blob:

 const generateImg = async () => { const canvas = await html2canvas(document.getElementById('hello')); const img = canvas.toDataURL('image/png'); const res = await fetch(img); return res.blob(); };

Este blob se puede pasar a una versión más manual de su SDK:

 const uploadImg = (blob: Blob) => { const url = `https://api.pinata.cloud/pinning/pinFileToIPFS`; const data = new FormData(); data.append('file', blob); const metadata = JSON.stringify({ name: 'testname', }); data.append('pinataMetadata', metadata); const pinataOptions = JSON.stringify({ cidVersion: 0, }); data.append('pinataOptions', pinataOptions); return axios .post(url, data, { maxBodyLength: 'Infinity' as any, // this is needed to prevent axios from erroring out with large files headers: { // @ts-ignore 'Content-Type': `multipart/form-data; boundary=${data._boundary}`, pinata_api_key: apiKey, pinata_secret_api_key: apiSecret, }, }) .then((response) => { console.log(response); }) .catch((error) => { console.log(error); }); };
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!