我在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>
答案 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)
我不明白这个问题的实质。
我认为有必要先将文件上传到存储。上载操作应该是事务性的(全部或全部)。在任何文件上传过程中出错,整个上传失败。如果上传成功-然后将有关文件的信息保存到数据库中。
我建议存储有关上传文件的以下附加信息:
System.currentTimeMillis()
或UUID UUID.randomUUID().toString()
此外,如果系统包含大量文件-我建议将文件存储在单独的目录中,以加快搜索速度。您可以按创建时间(例如,每个月新建目录)或用户ID来存储到目录。这完全取决于文件的搜索条件。
我建议您在存储之前使用任何唯一ID(例如UUID)重命名文件,以避免冲突。当然,您应该在数据库中存储原始和重命名的文件名。同样,如果将打开包含文件的目录,则此方法将不允许用户选择文件名。我的意思是用户无法猜测外来文件https://file-storage/user-john-dou/logo.jpg
如果要处理图像,可以考虑在存储前调整大小。