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

1.1K
Views
AWS Lambda y S3: el archivo pdf cargado está en blanco/corrupto

Tengo una aplicación Spring (que se ejecuta en AWS Lambda) que obtiene un archivo y lo carga en AWS S3.

Spring Controller envía un MultipartFile a mi método, donde se carga en AWS S3, utilizando Amazon API Gateway.

 public static void uploadFile(MultipartFile mpFile, String fileName) throws IOException{ String dirPath = System.getProperty("java.io.tmpdir", "/tmp"); File file = new File(dirPath + "/" + fileName); OutputStream ops = new FileOutputStream(file); ops.write(mpFile.getBytes()); s3client.putObject("fakebucketname", fileName, file); }

Intento cargar un archivo PDF que tiene 2 páginas con texto. Después de la carga, el archivo PDF (en AWS S3) tiene 2 páginas en blanco.

¿Por qué el archivo PDF subido está en blanco?

También probé con otros archivos (como una imagen PNG) y cuando lo abro, la imagen que cargué está dañada.

Lo único que funcionó fue cuando subí un archivo de texto.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

¿Puedo decir que he visto a personas hacer esta asignación, por lo que su aplicación acepta un MultipartFile y lo carga por proxy en S3?

Cargar a su aplicación y luego a S3 honestamente es el enfoque incorrecto y tiene muchos inconvenientes que anulan los beneficios de usar S3 en primer lugar. Simplemente genere una URL prefirmada y haga que su usuario cargue directamente a S3. Esto es preferible por algunas razones, pero las principales son:

  • Una aplicación que acepta la carga de MultipartFile puede ser fácilmente DDOS si no se tiene cuidado, esto le sucedió a nuestra aplicación cuando alguien cargó muchos archivos al mismo tiempo que todo el sistema dejó de funcionar.
  • Será MUCHO más lento cargarlo en su aplicación backend y luego cargarlo en S3.

Si estaba usando Cognito, también puede lograr esto con 0 código de back-end usando AWS Amplify. Lo cual recomiendo encarecidamente, pero si no, la URL prefirmada es el camino a seguir.

over 4 years ago · Santiago Trujillo Report

0

Resulta que esto hará este truco. Se trata de codificar, gracias a la ayuda de @KunLun. En mi escenario, el archivo es el archivo de varias partes (pdf) que se pasa a aws a través de un POST a la url.

  • el servidor obtiene un archivo con este byte -> 0010 (esto no se interpretará correctamente, porque un byte estándar tiene 8 bits)
  • entonces, lo codificamos en base 64 -> no importa el resultado
  • decodifíquelo para obtener un byte estándar -> 0000 0010 (ahora este es un byte estándar y aws lo interpreta correctamente)
  • Esta fuente aquí también ayudó mucho --> https://www.javaworld.com/article/3240006/base64-encoding-and-decoding-in-java-8.html?page=2
 Base64.Encoder enc = Base64.getEncoder(); byte[] encbytes = enc.encode(file.getBytes()); for (int i = 0; i < encbytes.length; i++) { System.out.printf("%c", (char) encbytes[i]); if (i != 0 && i % 4 == 0) System.out.print(' '); } Base64.Decoder dec = Base64.getDecoder(); byte[] barray2 = dec.decode(encbytes); InputStream fis = new ByteArrayInputStream(barray2); PutObjectResult objectResult = s3client.putObject("xxx", file.getOriginalFilename(), fis, data);
over 4 years ago · Santiago Trujillo 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!