AWS 람다와 S3는 - 업로드 된 pdf 파일은 빈 / 손상

쿤룬 :

나는 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);

추천

출처http://10.200.1.11:23101/article/api/json?id=478690&siteId=1