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

时间:2019-07-09 07:03:18

标签: java spring spring-boot

我在Spring Boot项目中工作,那里有两个实体。

客户实体

@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;


....

}

文档实体:

   @Entity
    public class Document{

    // mapping annotation ...
    private Long id;

    // mapping annotation ...
    private String name;

    // mapping annotation ...
    private int size;

    // mapping annotation ...
    private Client client;


    ....

    }

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

我正在使用带有Angular的Spring Boot,我不是在问代码,而是想知道根据最佳实践实现此目的的最佳方法是什么。 < / strong>

2 个答案:

答案 0 :(得分:2)

我也有一个类似的用例。我们使用文件压缩方法( require less storage fast for small documents )完成了此操作。当客户上传文档时,我们将创建新的Zip文件并以唯一的方式命名。 (不更改原始文档的名称)。例如,您可以使用clientID + uploadTime指定唯一的名称。

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

  • 仅创建一个目录(不是理想的方法)
  • 根据ClientId
  • 创建目录
  • 根据UploadTime (DayWise, MonthWise)
  • 创建目录

如果 all 个文档成功上传,则可以保存表中的文档信息。请注意,如果将来更改路径,则存储文档的路径可能会造成问题,因此仅存储文档名称。在这里,您需要存储每个文档的详细信息,因此可以创建两个表。 One table with id(pk), client Id, zip filename another with id(fk), document name, size etc.

您可以在application properties

中配置最大文件大小和最大请求​​大小
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.  

答案 1 :(得分:0)

我不明白这个问题的实质。

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

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

  1. 文件上传的日期和时间
  2. 请求的ID。要知道一个请求中已上传了多个文件。您可以使用毫秒System.currentTimeMillis()或UUID UUID.randomUUID().toString()
  3. 中的时间

此外,如果系统包含大量文件-我建议将文件存储在单独的目录中,以加快搜索速度。您可以按创建时间(例如,每个月新建目录)或用户ID来存储到目录。这完全取决于文件的搜索条件。

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

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