Чтение файла большего размера с сервера с api spring rest с точки зрения производительности - PullRequest
0 голосов
/ 16 июня 2020

Я могу прочитать файл журнала с сервера и успешно загрузить его через API Spring rest, теперь мой запрос заключается в том, что прямо сейчас размер моего входного файла на сервере составляет 500 МБ, но в любом случае, если мой файл достигает 1 ГБ, поэтому в этом случае, какие изменения мне нужно сделать в приведенном ниже фрагменте кода для повышения производительности

  @GetMapping("/download/{filename}")
    public ResponseEntity<Resource> download(@RequestParam String filename) throws IOException {
        File file = new File(SERVER_LOCATION + File.separator + filename + EXTENSION);

        HttpHeaders header = new HttpHeaders();
        header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename + EXTENSION);
        header.add("Cache-Control", "no-cache, no-store, must-revalidate");
        header.add("Pragma", "no-cache");
        header.add("Expires", "0");

        Path path = get(file.getAbsolutePath());
        ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));

        final ResponseEntity<Resource> resourceResponseEntity = ResponseEntity.ok()
                .headers(header)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(resource);
        return resourceResponseEntity;
    }

1 Ответ

0 голосов
/ 16 июня 2020

Ваш текущий код читает весь файл в память, используя Files.readAllBytes(path). Хотя это может работать для файлов smalli sh, оно не работает с большими файлами или большим количеством открытых файлов. Вместо этого вам следует не читать, а использовать, например, File или InputStream.

File file = new File(SERVER_LOCATION + File.separator + filename + EXTENSION);
Resource resource = new FileSystemResource(file);

или

Path path = get(file.getAbsolutePath());
Resource resource = new InputStreamResource(Files.newInputStream(path));

Это будет загружаться только при необходимости и напрямую передавать результат.

...