首页 > 解决方案 > 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

谁能告诉你有什么问题吗?

标签: javaspring-bootfile-uploadmultipartmultipartfile

解决方案


我有同样的问题,它曾经是工作文件,但过了一段时间,它停止工作。我几乎可以肯定你的问题是这个,因为我们有相同的代码并且我们的场景是相同的。我想出来的方法是:

调试

我添加了一条语句来打印错误以查看实际发生的情况,您当前所做的只是获取错误消息,而不是整个错误。所以改成:

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 并将其存储在数据库中,以便以后访问。


推荐阅读