Arruda
Arruda

Reputation: 880

Playframework 2.0.1 Model with an uploaded file reference

I'm confused about how should I do a model that has some uploaded file, like for exemplo:

User has photos.

I already found out how to upload a file, but the question here is about what to do with the file that was now uploaded, how can I link this new uploaded file(photo in the exemple) with a model(the user in the example).

Thanks.

OBS: Using play for Java here, not Scala.

Upvotes: 0

Views: 340

Answers (2)

ndeverge
ndeverge

Reputation: 21564

You have to link your User to his picture. For that, your best option is to use the User id, which should be unique.

Then, if you uploaded your photo under the pictures/user folder in your filesystem, then you should save the picture as pictures/user/USER_ID.png (png or jpg or anything else).

Then, you can have an action which retrieve the picture according to the user 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();
}

And the Picture class looks like:

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";
          }
    }
}

I did something similar once (but the pictures were stored in memory), you can take a look here.

Upvotes: 1

marcospereira
marcospereira

Reputation: 12212

Just create a convention if user has only one picture. Per instance, if your user was registered in 2012-07-23 and has id = 100, move the file to some place mapped from these data:

/uploaded-dir/2012/07/23/100/picture.jpg

After that, you can use the same convention to read the file.

Upvotes: 0

Related Questions