java如何发送base64格式的大文件?
我有一个弹簧&;Angular application和我开发了一项服务,可以上传和下载文件
将要下载的文件从我服务器上的文件夹中取出(因此我将使用FTP将文件放入文件夹),然后在base64中编码并显示给用户
用户可以下载文件,我设法让用户下载大文件,方法是将长的base64字符串分割成256字节的小字符串(我在本地测试了它,即使它仍然很慢也能工作)
问题是在我的Spring back-end中,我无法压缩base64字符串,在我的体系结构中显示文件的唯一方法是返回base64字符串,但当涉及到大文件时,我会出现以下错误:
Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space
下面是我用来返回base64字符串的服务片段:
@Override
public List<FileDto> loadAll() {
List<FileDto> files = new ArrayList<FileDto>();
try {
File folder = new File("uploads"+ File.separator +"adminfolder");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
String directory = folder.toString() + File.separator + listOfFiles[i].getName();
String allegato = BufferedImageUtility.encodeFileToBase64Binary(directory);
String tipoFile = BufferedImageUtility.getMimeType(directory);
String estensione = "";
files.add(new FileDto("", allegato, listOfFiles[i].getName(), tipoFile, estensione));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
这里是encodeFileToBase64Binary()方法:
public static String encodeFileToBase64Binary(String fileName) {
String encodedString = "";
try {
File file = new File(fileName);
byte[] bytes = loadFile(file);
byte[] encoded = Base64.getEncoder().encode(bytes);
encodedString = new String(encoded,StandardCharsets.US_ASCII);
} catch (IOException e) {
logger.debug("errore encodeFileToBase64Binary, ", e);
throw new EFWMException(e);
}
return encodedString;
}
# 1 楼答案
与其用
loadFile(file)
将整个文件加载到内存中,我建议您尝试将其流式传输到Base64中请尝试以下编码方式:
# 2 楼答案
正如评论中已经指出的,您必须以流式方式发送响应。下面是一个示例rest控制器,您应该对其进行调整以适合您的应用程序: