쿤룬 :
나는 AWS S3에 파일 업로드를 취득하는 봄 앱 (AWS 람다에서 실행)가 있습니다.
봄 컨트롤러는를 보냅니다 MultipartFile
가 아마존 API 게이트웨이를 사용하여, AWS S3에 업로드의 내 방법으로.
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);
}
나는 텍스트 2 페이지가있는 PDF 파일을 업로드하려고합니다. 업로드 후, (AWS S3의) PDF 파일이 빈 페이지가 있습니다.
왜 업로드 된 PDF 파일 빈은?
나는 또한 다른 (PNG 이미지와 같은) 파일 때 내가 업로드 한 이미지가 손상을 열고 함께했습니다.
나는 텍스트 파일을 업로드 할 때 작동하는 유일한 것은이었다.
라마 :
문제는이 트릭을 할 것으로 밝혀졌습니다. 그 모두에 대한 인코딩, @KunLun의 도움에 감사합니다. 내 시나리오에서는 파일은 URL에 POST를 통해 AWS로 전달되는 멀티 파일 (PDF)이다.
- 서버가이 바이트 파일을 얻는다 -> 0010 (이 잘 해석되지 않습니다, 표준 바이트는 8 개 비트를 가지고 있기 때문에)
- 그래서, 우리는 기본 64에서 인코딩 -> 어떤 결과를 중요하지 않습니다
- 표준 바이트를 얻기 위해 그것을 디코딩 -> 0010 0000 (지금은 표준 바이트이며이 AWS에 의해 바로 해석 것)
- 이 소스는 여기뿐만 아니라 많은 도움 -> 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);