0

I have some user uploaded images that I'm storing as byte[ ] on a heroku Postgres db. I'm trying to download an image as a jpeg through an http response similar to something below.

ImageModel image = ImageModel.getImage(imageID);
response().setContentType("image/jpeg");
response().setHeader("Content-disposition","attachment; filename=image.jpeg");
return ok(image.imageByteArray);

When I try to return it I get a null pointer exception. I'm using Ebean to save and load my ImageModel. When I put the model into a JsonNode and return that I can see the data for that byte[].

"id":1,"imageByteArray":"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","processedImage":null}

However, if I try to reference the byte[] directly from the model I get the null pointer exception. I'm a bit of a Play noob so I'm not sure what is going on. Any help would be greatly appreciated.

[error] - application - Exception
java.lang.NullPointerException: null
at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:106) ~[na:1.8.0_51]
at controllers.Application.requestImageFile(Application.java:95) ~[classes/:2.4.2]
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$4$$anonfun$apply$4.apply(Routes.scala:208) [classes/:na]
at router.Routes$$anonfun$routes$1$$anonfun$applyOrElse$4$$anonfun$apply$4.apply(Routes.scala:208) [classes/:na]
at play.core.routing.HandlerInvokerFactory$$anon$4.resultCall(HandlerInvoker.scala:136) [play_2.11-2.4.2.jar:2.4.2]
at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3$$anon$1.invocation(HandlerInvoker.scala:127) [play_2.11-2.4.2.jar:2.4.2]
at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:70) [play_2.11-2.4.2.jar:2.4.2]
at play.http.DefaultHttpRequestHandler$1.call(DefaultHttpRequestHandler.java:20) [play_2.11-2.4.2.jar:2.4.2]
at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) [play_2.11-2.4.2.jar:2.4.2]
at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:94) [play_2.11-2.4.2.jar:2.4.2]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:40) [play_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) [play_2.11-2.4.2.jar:2.4.2]
at scala.concurrent.impl.Future$.apply(Future.scala:31) [scala-library-2.11.6.jar:na]
at scala.concurrent.Future$.apply(Future.scala:492) [scala-library-2.11.6.jar:na]
at play.core.j.JavaAction.apply(JavaAction.scala:94) [play_2.11-2.4.2.jar:2.4.2]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) [play_2.11-2.4.2.jar:2.4.2]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:105) [play_2.11-2.4.2.jar:2.4.2]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) [play_2.11-2.4.2.jar:2.4.2]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:104) [play_2.11-2.4.2.jar:2.4.2]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:103) [play_2.11-2.4.2.jar:2.4.2]
at scala.Option.map(Option.scala:146) [scala-library-2.11.6.jar:na]
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:103) [play_2.11-2.4.2.jar:2.4.2]
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:96) [play_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:524) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:560) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:536) [play-iteratees_2.11-2.4.2.jar:2.4.2]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.11.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.11.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
MattH
  • 87
  • 2
  • 11

3 Answers3

1

I personally would need some more information to debug this, however, perhaps you can gain the information you need to continue based on an example of how I would store and retrieve images in PostgreSQL using Ebean.

The model would look something like this:

public class User extends Model {

    public static Finder<LInteger, User> find = new Finder<Integer,User>(User.class);

    @Id
    public Integer id;

    public String name;

    @Constraints.Required
    @Constraints.Email
    public String email;

    public String password;

    @Lob
    public byte[] photo;

    public static User findByEmail(String email) {
        return find.where().eq("email", email).findUnique();
    }

}

The controller would look something like this:

public class Application extends Controller {

    public static Result userPhoto(Integer userId) {
        User user = User.find.ById(userId);

        if (user == null) {
            return notFound();

        }

        if (user.photo == null) {
            return ok(Play.application().getFile("/public/images/default-user.jpg"), true).as("image/jpeg");
        }

        return ok(new ByteArrayInputStream(user.photo)).as("image/jpeg");
    }

}

I hope this helps!

Kevin
  • 1,403
  • 2
  • 11
  • 15
  • 1
    Just a note to say that instead of @Lob byte[] photo you can use File photo. Ebean will then stream the photo contents to/from a temp file and with large photos streaming can be a better approach memory wise. – Rob Bygrave Sep 10 '15 at 20:30
1

It looks like you need to wrap byte array in to ByteArrayInputStream

ByteArrayInputStream input = new ByteArrayInputStream(image.imageByteArray);
return ok(input);

Please look on the answers to this question: Displaying image object from controller in the browser

Community
  • 1
  • 1
Andriy Kuba
  • 8,093
  • 2
  • 29
  • 46
0

The first thing I would do is add a check for null after you get your ImageModel. e.g.:

ImageModel image = ImageModel.getImage(imageID);
if (image == null){
    Logger.error("image not retrieved ...");
}

If its not null, then are you using EBean to store stuff in db? Did you annotate your imageByteArray as a @Lob? Try going into your db and making sure there is a value for that column and its not null, there might be an issue saving the lob in the first place if its turns out to be null later on.

Also, if you want the image to be downloaded, your content type should be

response().setContentType("application/x-download");
Evgheni Crujcov
  • 470
  • 2
  • 8
  • No it is storing it just fine. I can see it in the database. If I load the entire model into a JsonNode and return it I can see the byte [ ] data in the response body. I'm pretty sure the array is not null. However, it checks as and is returning a null value. – MattH Sep 10 '15 at 19:37
  • Post some more code then of what happens inside the ImageModel class, and everything it interacts with. – Evgheni Crujcov Sep 11 '15 at 20:50