AWS Лямбда и S3 - загруженный файл PDF пуст - PullRequest
1 голос
/ 20 февраля 2020

У меня есть довольно простая функция, которая загружает файл PDF в AWS S3 (https://codedestine.com/aws-s3-putobject-java/), используя AWS Lambda с Amazon API Gateway.

Я пытаюсь загрузить файл PDF, который имеет 2 страницы с текстом. После загрузки файл PDF (на AWS S3) содержит 2 пустых страницы.

Этот метод используется для загрузки файла PDF на 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);

}

Почему загруженный файл PDF пуст?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Оказывается, это поможет. Все дело в кодировании, благодаря помощи @KunLun. В моем сценарии файл - это составной файл (pdf), который передается в aws через POST на URL.

  • сервер получает файл с этим байтом -> 0010 (это не будет истолковано правильно, потому что стандартный байт имеет 8 бит)
  • , поэтому мы кодируем его в базе 64 -> не имеет значения, какой результат декодирует его, чтобы получить стандартный байт -> 0000 0010 (теперь это стандарт байт, и это интерпретируется прямо как 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);


Еще один очень Важный момент, который необходимо включить, заключается в том, что параметры API-шлюза должны быть правильно настроены для поддержки двоичных типов данных. AWS Консоль -> Шлюз API -> Настройки -> включить то, что у меня есть ниже на прилагаемом фото

1 голос
/ 20 февраля 2020

Вы используете выходной поток в качестве входных данных для запроса на загрузку. Просто используйте File и включите тип контента, например:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...