Eu tenho um aplicativo Primavera (em execução no AWS Lambda) que recebe um arquivo e carrega-lo no AWS S3.
O Controlador de Primavera envia um MultipartFile
para o meu método, onde ele é carregado para AWS S3, usando 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);
}
Eu tento fazer upload de um arquivo PDF que tem 2 páginas com texto. Após a transferência, o arquivo PDF (em AWS S3) tem 2 páginas em branco.
Porque é que o espaço em branco arquivo PDF carregado?
Eu também tentei com outros arquivos (imagem PNG como) e quando eu abri-lo a imagem que eu carregado está corrompido.
A única coisa que funcionou foi quando eu upload de um arquivo de texto.
Acontece que isso vai fazer este truque. Seu tudo sobre codificação, graças à ajuda de @KunLun. Em meu cenário, é o arquivo multipart (pdf) que é passado para a AWS através de um POST para o URL.
- servidor recebe um arquivo com este byte -> 0010 (isso não vai ser interpretado certo, porque um byte padrão tem 8 bits)
- assim, nós codificá-lo na base 64 -> Não importa o resultado
- decodificá-lo para obter um byte padrão -> 0000 0010 (agora este é um byte padrão e é interpretado junto AWS)
- Esta fonte aqui ajudou muito bem -> 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);