java - Spring Boot文件上传问题-无法存储文件错误仅在几天后发生
问题描述
我有一个使用 Java Spring Boot 2.4.2 创建的 RESTful API。
我最近遇到的主要问题之一是,分段文件上传工作正常,但几天后相同的代码将无法工作。重新启动 RESTFul JAR 应用程序后,它将恢复正常。
Postman 中显示的错误:无法存储文件。错误
与此相关的代码在这里:
try {
FileUploadUtil.saveFile(uploadPath, file.getOriginalFilename(), file);
} catch (IOException e) {
throw new RuntimeException("Could not store the file. Error: " + e.getMessage());
}
和 FileUploadUtil 类:
public class FileUploadUtil {
public static void saveFile(String uploadDir, String fileName, MultipartFile multipartFile) throws IOException {
Path uploadPath = Paths.get(uploadDir);
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
try (InputStream inputStream = multipartFile.getInputStream()) {
Path filePath = uploadPath.resolve(fileName);
Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ioe) {
throw new IOException("Could not save uploaded file: " + fileName, ioe);
}
}
public static File fileFor(String uploadDir, String id) {
return new File(uploadDir, id);
}}
调用上述第一部分代码的主要 POST API 方法头是:
@PostMapping(value = "/clients/details/{clientDetailsId}/files/{department}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@PreAuthorize("hasAuthority('PERSONNEL') or hasAuthority('CUSTODIAN') or hasAuthority('ADMIN')")
public ResponseEntity<ClientDetails> createClientDetailsFiles(@PathVariable("clientDetailsId") long clientDetailsId,
@PathVariable("department") String department,
@RequestPart(value = "FORM_SEC_58", required = false) MultipartFile[] FORM_SEC_58_file,@RequestPart(value = "FORM_SEC_78", required = false) MultipartFile[] FORM_SEC_78_file,
@RequestPart(value = "FORM_SEC_105", required = false) MultipartFile[] FORM_SEC_105_file,
@RequestPart(value = "FORM_SEC_51", required = false) MultipartFile[] FORM_SEC_51_file,
@RequestPart(value = "FORM_SEC_76", required = false) MultipartFile[] FORM_SEC_76_file)
和 application.properties 方面:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=90MB
spring.servlet.multipart.max-request-size=90MB
谁能告诉你有什么问题吗?
解决方案
我有同样的问题,它曾经是工作文件,但过了一段时间,它停止工作。我几乎可以肯定你的问题是这个,因为我们有相同的代码并且我们的场景是相同的。我想出来的方法是:
调试
我添加了一条语句来打印错误以查看实际发生的情况,您当前所做的只是获取错误消息,而不是整个错误。所以改成:
try {
FileUploadUtil.saveFile(uploadPath, file.getOriginalFilename(), file);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Could not store the file. Error: " + e.getMessage());
}
实际问题
错误是FileAlreadyExistsException
FileAlreadyExistsException
基本上,这意味着您要尝试两次上传同名文件。
解决方案
要解决此问题,您可以使用不同的方法。其中之一是为文件生成 UUID 并将其存储在数据库中,以便以后访问。
推荐阅读
- linkedin - 需要 full_profile 示例 json
- python - TensorFlow 运行时无法在 Windows 7 上加载
- c - 无法理解此 C 代码片段中 (b&1) 的含义
- sql - sql - 一段时间内的值频率(例如上周、上个月、去年)
- amazon-web-services - 如何在 cloudformation 中添加自定义属性?
- c++ - 创建友元函数以访问两个类的私有变量
- java - NullPointerException@Googlemap lambda 表达式?(gMapsfx)
- javascript - 使用流类型限制向对象添加属性
- html - 当 flex-direction 设置为 column 时,主轴是否沿垂直方向流动?
- arrays - 将差异导出到 CSV 并与来自单独 CSV PowerShell 的列合并