我对如何制作一个包含一些上传文件的模型感到困惑,例如:
用户有照片。
我已经知道如何上传文件,但这里的问题是关于如何处理现在上传的文件,如何将这个新上传的文件(示例中的照片)与模型(示例中的用户)链接)。
谢谢。
OBS:这里使用 Java 的 play,而不是 Scala。
我对如何制作一个包含一些上传文件的模型感到困惑,例如:
用户有照片。
我已经知道如何上传文件,但这里的问题是关于如何处理现在上传的文件,如何将这个新上传的文件(示例中的照片)与模型(示例中的用户)链接)。
谢谢。
OBS:这里使用 Java 的 play,而不是 Scala。
您必须将您的用户链接到他的图片。为此,您最好的选择是使用应该是唯一的用户 ID。
然后,如果您将照片上传到pictures/user
文件系统中的文件夹下,那么您应该将图片另存为pictures/user/USER_ID.png
(png 或 jpg 或其他任何格式)。
然后,您可以有一个根据用户 ID 检索图片的操作:
public static Result picture(String userId) {
Picture picture = Picture.findPicture(userId);
if (picture != null) {
response().setContentType(picture.contentType);
return ok(picture.bytes);
}
return notFound();
}
图片类看起来像:
public class Picture {
public byte[] bytes;
public String contentType;
public static Picture findPicture(String userId) {
String[] extensions = {"png","jpg"}; // an enum should be better
for (String extension:extensions) {
String path = "pictures/user/" + userId + "." + extension;
if (new File().exists(path)) {
Picture picture = new Picture();
picture.bytes = IOUtils.toByteArray(new FileInpustream(path));
picture.contentType = findContentType(extension);
return picture;
}
}
return null;
}
protected static String findContentType(String extension) {
if (extension.equalsIgnoreCase("jpg") {
return "image/jpeg";
} else if (extension.equalsIgnoreCase("png") {
return "image/png";
}
}
}
我曾经做过类似的事情(但图片存储在内存中),你可以看看这里。
如果用户只有一张图片,只需创建一个约定。例如,如果您的用户在 2012 年 7 月 23 日注册并且 id = 100,则将文件移动到从这些数据映射的某个位置:
/uploaded-dir/2012/07/23/100/picture.jpg
之后,您可以使用相同的约定来读取文件。