Java 如何在spring引导中使用REST API将大型文件从服务器应用程序传输到客户端应用程序

Java 如何在spring引导中使用REST API将大型文件从服务器应用程序传输到客户端应用程序,java,rest,spring-boot,file-transfer,large-files,Java,Rest,Spring Boot,File Transfer,Large Files,我正在服务器应用程序中编写一个RESTAPI,它将允许远程客户端应用程序传输服务器客户端大型文件。将发送到大约1-5GB的文件。此外,它应能抵抗不良的传输和连接。我编写了一个服务来读取文件并将其发送到客户端。对于小文件,没有问题,它已被发送。这个问题已经出现在大约100mb的文件中,因为我没有从http获得答案。 我尝试读取片段文件,只发送片段,以便稍后完全使用客户端应用程序,但出现了内存使用过度的问题。如何在不将文件加载到应用程序内存的情况下传输文件 FileInputStream input

我正在服务器应用程序中编写一个RESTAPI,它将允许远程客户端应用程序传输服务器客户端大型文件。将发送到大约1-5GB的文件。此外,它应能抵抗不良的传输和连接。我编写了一个服务来读取文件并将其发送到客户端。对于小文件,没有问题,它已被发送。这个问题已经出现在大约100mb的文件中,因为我没有从http获得答案。 我尝试读取片段文件,只发送片段,以便稍后完全使用客户端应用程序,但出现了内存使用过度的问题。如何在不将文件加载到应用程序内存的情况下传输文件

FileInputStream inputStream = new FileInputStream(file2download);
        response.setContentType(URLConnection.guessContentTypeFromName(file2download.getName()));
        response.setContentLength((int) file2download.length());
        String headerValue = String.format("attachment; filename=\"%s\"", file2download.getName());
        response.setHeader("Content-Disposition", headerValue);
        OutputStream outStream = response.getOutputStream();
        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead = -1; // czytamy w pętli po fragmencie, który następnie przepisujemy do strumienia wyjściowego
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }
        inputStream.close();
        outStream.close();

此文件的副本不是副本,因为它无法解决传输大型文件的问题。使用InputStreamResource或ByteArrayResource http响应,他仅从1GB返回50MB,并且不能确保丢失服务器客户端连接和恢复下载部分文件的安全性。ByteArrayResource不需要复制每个字节。InputStreamResource应该是一个高性能的解决方案,但它不允许恢复下载。要恢复下载,您需要实现字节范围“功能”。或者春天需要。您使用的是哪个版本?Spring boot 2.0.7版