Tengo una aplicación de primavera (que se ejecuta en AWS Lambda), que consigue un archivo y lo carga en AWS S3.
El controlador envía una primavera MultipartFile
a mi método, donde ha subido a AWS S3, Amazon usando 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 cargar, el archivo PDF (en AWS S3) tiene 2 páginas en blanco.
¿Por qué es el espacio en blanco de archivos PDF cargado?
También probé con otros archivos (como imagen PNG) y cuando lo abro la imagen que he subido está corrupto.
El único que funcionó fue cuando he subido un archivo de texto.
Resulta que esto va a hacer este truco. Todo es cuestión de codificación, gracias a la ayuda de @KunLun. En mi caso, es el archivo de varias partes (pdf) que se pasa a través de AWS un POST a la URL.
- servidor recibe un archivo con este byte -> 0010 (esto no será interpretado bien, porque un byte tiene 8 bits estándar)
- así, codificamos en base 64 -> no importa qué resultado
- descodificarlo para obtener un byte estándar -> 0000 0010 (ahora esto es un byte estándar y se interpreta junto a AWS)
- Esta fuente aquí ayudó mucho también -> 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);