例のように、アップロードされたファイルを持つモデルをどのように行うべきかについて混乱しています:
ユーザーは写真を持っています。
ファイルをアップロードする方法はすでにわかりましたが、ここでの質問は、現在アップロードされているファイルをどうするか、この新しくアップロードされたファイル (例の写真) をモデル (例のユーザー) にリンクするにはどうすればよいかということです)。
ありがとう。
OBS: ここでは Play for Java を使用しています。Scala ではありません。
例のように、アップロードされたファイルを持つモデルをどのように行うべきかについて混乱しています:
ユーザーは写真を持っています。
ファイルをアップロードする方法はすでにわかりましたが、ここでの質問は、現在アップロードされているファイルをどうするか、この新しくアップロードされたファイル (例の写真) をモデル (例のユーザー) にリンクするにはどうすればよいかということです)。
ありがとう。
OBS: ここでは Play for Java を使用しています。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();
}
そして、Pictureクラスは次のようになります。
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";
}
}
}
私は一度似たようなことをしました(しかし、写真はメモリに保存されていました)、ここで見ることができます。
ユーザーが画像を 1 つしか持っていない場合は、規則を作成するだけです。たとえば、ユーザーが 2012 年 7 月 23 日に登録され、id = 100 の場合、これらのデータからマッピングされた場所にファイルを移動します。
/uploaded-dir/2012/07/23/100/picture.jpg
その後、同じ規則を使用してファイルを読み取ることができます。