gpt4 book ai didi

java - MultipartFile 问题,无法转换为文件

转载 作者:行者123 更新时间:2023-11-29 04:05:54 27 4
gpt4 key购买 nike

我正在尝试上传超过 1 GB 的文件,我正在使用 Spring Boot。

我已尝试使用以下代码,但出现内存不足错误。

public void uploadFile(MultipartFile file) throws IOException {
try {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

String uploadFile= restTemplate.exchange(url, HttpMethod.POST,
new HttpEntity<>(new FileSystemResource(convert(file)), headers), String.class).getBody();

} catch (Exception e) {
throw new RuntimeException("Exception Occured", e);
}
}


private static File convert(MultipartFile file) throws IOException {
File convFile = new File(file.getOriginalFilename());
convFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}

我面临的主要问题是,我无法将 MultipartFile 转换为 java.io.File。

我什至尝试用 ByteArrayResource 替换 FileSystemResource,但仍然出现 OOM 错误。

我什至也尝试过使用下面的代码:

private static File convert(MultipartFile file) throws IOException {
CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile;
FileItem fileItem = commonsMultipartFile.getFileItem();
DiskFileItem diskFileItem = (DiskFileItem) fileItem;
String absPath = diskFileItem.getStoreLocation().getAbsolutePath();
File file = new File(absPath);
}

但是对于上面的代码片段,我得到了以下异常:

org.springframework.web.multipart.commons.CommonsMultipartFile cannot be cast to org.springframework.web.multipart.MultipartFile

  1. 谁能告诉我如何将 MultipartFile 转换为 java.io.File?

  2. 还有比 FileSystemResource 更好的方法吗?因为我每次上传前都必须在服务器中创建新文件。如果文件超过 1GB,则必须在服务器端创建另一个 1GB 的新文件,并且必须再次手动删除该文件,我个人不喜欢这种方法。

最佳答案

getBytes() 尝试将整个字节数组加载到内存中,这会导致您的OOM您需要做的是流式传输文件并将其写出。

尝试以下操作:

private static Path convert(MultipartFile file) throws IOException {
Path newFile = Paths.get(file.getOriginalFilename());
try(InputStream is = file.getInputStream();
OutputStream os = Files.newOutputStream(newFile))) {
byte[] buffer = new byte[4096];
int read = 0;
while((read = is.read(buffer)) > 0) {
os.write(buffer,0,read);
}
}
return newFile;
}

我更改了您的方法以返回 Path 而不是 File,它是 java.nio 包的一部分。该包优于 java.io,因为它经过了更多优化。

如果您确实需要一个 File 对象,您可以调用 newFile.toFile()

由于它返回一个 Path 对象,您可以使用 java.nio.file.Files 类在文件写出后将其重新定位到您的首选目录

private static void relocateFile(Path original, Path newLoc) throws IOException {
if(Files.isDirectory(newLoc)) {
newLoc = newLoc.resolve(original.getFileName());
}
Files.move(original, newLoc);
}

关于java - MultipartFile 问题,无法转换为文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58718541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com