Java 在Spring Boot中上载多个文件的最佳方法

Java 在Spring Boot中上载多个文件的最佳方法,java,spring,spring-boot,Java,Spring,Spring Boot,我在SpringBoot项目中工作,我有两个实体 客户实体: @Entity public class Client { // mapping annotation ... private Long id; // mapping annotation ... private String firstName; // mapping annotation ... private String lastName; // mapping annotation ... private Set&l

我在SpringBoot项目中工作,我有两个实体

客户实体

@Entity
public class Client {

// mapping annotation ...
private Long id;

// mapping annotation ...
private String firstName;

// mapping annotation ...
private String lastName;

// mapping annotation ...
private Set<Document> listDocument;


....

}
我的应用程序有一个表单,我可以在其中设置客户端的所有信息。另外,我有一个输入文件,需要上传多个文档。因此,当我单击“提交”按钮时,我必须将客户端信息保存到数据库中,同时所有关于文档(具有客户端Id)的信息(文档名称、大小…)都应保存在数据库中,然后将文件上载到服务器


我使用的是带Angular的Spring Boot,我不是在问代码,但我只是想知道根据最佳实践,实现这一点的最佳方法是什么。

我不理解这个问题的本质

在我看来,有必要先将文件上传到存储器。上载操作应该是事务性的(全部或无)。任何文件上载过程中出错整个上载失败。如果上载成功-则将有关文件的信息保存到数据库中

我建议存储有关上载文件的以下附加信息:

  • 上载文件的日期和时间
  • 请求的Id。要知道在一个请求中已上载多个文件。您可以使用毫秒
    System.currentTimeMillis()
    或UUID
    UUID.randomUUID().toString()形式的时间
  • 此外,如果系统包含大量文件,我建议将文件存储在单独的目录中,以加快搜索速度。您可以按创建时(例如每月新目录)或用户id存储到目录。这一切取决于文件的搜索条件

    我建议您在使用任何唯一id(例如UUID)存储之前重命名文件,以避免冲突。当然,您应该在数据库中存储原始和重命名的文件名。此外,如果包含文件的目录处于打开状态,此方法将不允许用户拾取文件名。我的意思是,用户无法猜测外来文件
    https://file-storage/user-john-dou/logo.jpg


    如果您正在处理图像,您可以考虑在存储之前调整大小。

    我也有一个类似的用例。我们已经通过文件压缩方法实现了这一点(
    需要更少的存储空间,
    对于小文档来说速度更快
    )。当客户端上传文档时,我们创建新的Zip文件,并以一种独特的方式命名它。 (不更改原始文件的名称)。例如,您可以使用
    clientID+uploadTime
    指定一个唯一的名称

    现在可以有多种存储方式(用于快速文档检索)

    • 只创建一个目录(不是理想的方法)
    • 根据
      ClientId
    • 根据上传时间(日、月)创建目录
    如果所有文档上传成功,则可以将文档信息保存在表中。请注意,如果将来路径发生更改,则存储文档的路径可能会产生问题,因此只存储文档的名称。因为这里需要存储每个文档的详细信息,所以可以创建两个表<代码>一个带有id(pk)、客户端id、zip文件名的表,另一个带有id(fk)、文档名、大小等的表。

    您可以在
    应用程序属性

    MULTIPART (MultipartProperties)
        spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
        spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
        spring.servlet.multipart.location= # Intermediate location of uploaded files.
        spring.servlet.multipart.max-file-size=1MB # Max file size.
        spring.servlet.multipart.max-request-size=10MB # Max request size.
        spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.  
    

    感谢您的时间,您的回答很清楚,您说您建议在使用任何唯一id存储之前重命名文件,因此如果我想使用用户的is重命名文件,那么我必须从数据库开始,我的意思是保存用户获取其id,然后开始上载文件,使用id用户作为文件名?这是否正确?您不能将用户id用作新文件名。因为同一用户可以有多个文件。如果您需要用户id,您可以从会话或JWT令牌获得它,因为它是不可变的。
    MULTIPART (MultipartProperties)
        spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
        spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
        spring.servlet.multipart.location= # Intermediate location of uploaded files.
        spring.servlet.multipart.max-file-size=1MB # Max file size.
        spring.servlet.multipart.max-request-size=10MB # Max request size.
        spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.