S3 скачать pdf - REST API - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь обработать один из моих PDF-файлов, хранящихся на S3, с помощью Spring Boot Rest API.

Ниже мой код:

        byte[] targetArray = null;

        InputStream is = null;

        S3Object object = s3Client
                    .getObject(new GetObjectRequest("S3_BUCKET_NAME", "prefixUrl"));

        InputStream objectData = object.getObjectContent();

    BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));

    char[] charArray = new char[8 * 1024];
    StringBuilder builder = new StringBuilder();
    int numCharsRead;
    while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {

        builder.append(charArray, 0, numCharsRead);
    }
    reader.close();

    objectData.close();
    object.close();
    targetArray = builder.toString().getBytes();

    is = new ByteArrayInputStream(targetArray);


    return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
                    .cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
                    .body(new InputStreamResource(is));

Когда я запускаю свой API с помощью почтальона, я могу загрузить файл PDF, но проблема в том, что он совершенно пустой. В чем может быть проблема?

S3 осуществляет потоковую передачу данных и не сохраняет буфер, а данные хранятся в двоичном формате (PDF), поэтому как серверные данные должны использовать Rest API.

Как это решить?

1 Ответ

0 голосов
/ 27 апреля 2018

Следующий простой код должен работать для вас, не знаете, почему вы пытаетесь преобразовать символы в байты и наоборот? Попробуйте этот, он отлично работает. Оба PostMan / Браузер.

@GET
@RequestMapping("/document")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
@Produces("application/pdf")
public ResponseEntity<InputStreamResource> getDocument() throws IOException {

    final AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient();

    S3Object object = s3.getObject("BUCKET-NAME", "DOCUMENT-URL");
    S3ObjectInputStream s3is = object.getObjectContent();


    return ResponseEntity.ok().contentType(org.springframework.http.MediaType.APPLICATION_PDF).cacheControl(CacheControl.noCache())
            .header("Content-Disposition", "attachment; filename=" + "testing.pdf")
            .body(new InputStreamResource(s3is));

}
...