我正在使用Mongo模式发布表单。适用于所有字符串,但现在我正尝试上传文件。我应指定文件在架构中属于哪种类型的字段?
@RestController
public class TestController {
@GetMapping("/test")
public Resource<User> getTest() {
Resource<User> resource = new Resource<>();
resource.setData(new User("test user"));
return resource;
}
@Builder
@Getter
@Setter
@AllArgsConstructor
static class User {
private String username;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
static class Resource<T> {
private T data;
private Set<String> errors;
}
}
我应该使用哪种类型的“源”字段,该字段将是来自表单的文件
答案 0 :(得分:1)
通常,您将文件数据存储到数据库中(如果要存储文件的话)。
有几种存储文件数据的方法。
您的文件大小小于16 MB。您可以将数据直接存储到集合中的缓冲区(二进制数据)中。
source : { data: Buffer, contentType: String }
如果文件大小超过16MB,则可以使用GridFS。
答案 1 :(得分:0)
这实际上取决于您的用例-特别是您要处理的约束。
我可以想到两种方法:
type: Buffer
。type: String
中的base64
。将其存储为Buffer
可能是存储空间/速度方面最有效的方法。它还使您可以灵活地将其转换为用例所需的任何类型。
将其存储为String
将使您在需要访问文件进行下载时可以更轻松地控制文件内容,因为您无需从Buffer
转换为base64
。
我个人比较喜欢将文件存储为Buffer
,并附加到其他必填字段上,例如filename
和mimetype
,它们会产生类似以下内容:
source: {
file: { type: Buffer, required: true },
filename: { type: String, required: true },
mimetype: { type: String, required: true }
}
...但是这也特定于我的用例。
还有第三种选择,即在文件中使用GridFS
将其存储在mongo中,以防文件大小超过16MB。您可以在其官方文档页面中了解更多相关信息:https://docs.mongodb.com/manual/core/gridfs/