Tengo una función bastante simple que carga un archivo PDF en un AWS S3 ( https://codedestine.com/aws-s3-putobject-java/ ) usando AWS Lambda con Amazon API Gateway.
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.
Este es el método que utilizo para cargar el archivo PDF en AWS S3.
public static void uploadFile2(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); }¿Por qué el archivo PDF subido está en blanco?
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.
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); Otra pieza muy importante que se debe incluir es que la configuración de API Gateway debe configurarse correctamente para admitir tipos de datos binarios. Consola de AWS --> API Gateway --> Configuración --> incluir lo que tengo a continuación en la foto adjunta 
Está utilizando un flujo de salida como entrada para la solicitud de carga. Simplemente use Archivo e incluya el tipo de contenido, por ejemplo:
File file = new File(fileName); PutObjectRequest request = new PutObjectRequest("bucketname", "keyname", file); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType("application/pdf"); request.setMetadata(metadata); s3Client.putObject(request);Cuando está cargando archivos usando FORM-DATA del lado del cliente al servidor, el servidor obtendrá ese archivo como base64. Por lo tanto, debe decodificarlo para que el archivo real se cargue en su depósito de aws S3.
Referencia rápida usando nodeJS.
const decodedFile = Buffer.from(<--add your encode base64 file -->, 'base64');Ese [const decodedFile] será su valor para los parámetros {Body} para s3. ¡Puedes hacer el mismo concepto o lógica con cualquier lenguaje de programación!
Gracias.