diff --git a/src/main/java/org/forkalsrud/album/db/ThumbnailDatabase.java b/src/main/java/org/forkalsrud/album/db/ThumbnailDatabase.java index ea0fd4e..314ae90 100644 --- a/src/main/java/org/forkalsrud/album/db/ThumbnailDatabase.java +++ b/src/main/java/org/forkalsrud/album/db/ThumbnailDatabase.java @@ -93,7 +93,9 @@ public class ThumbnailDatabase extends TupleBinding { img.mimeType = in.readString(); int lobLen = in.readInt(); img.bits = new byte[lobLen]; - in.read(img.bits, 0, lobLen); + if (lobLen > 0) { + in.read(img.bits, 0, lobLen); + } return img; } @@ -104,8 +106,12 @@ public class ThumbnailDatabase extends TupleBinding { out.writeInt(1); // version 1 out.writeLong(img.lastModified); out.writeString(img.mimeType); - out.writeInt(img.bits.length); - out.write(img.bits); + if (img.bits != null) { + out.writeInt(img.bits.length); + out.write(img.bits); + } else { + out.writeInt(0); + } } } diff --git a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java index f9e276a..183f93e 100644 --- a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java +++ b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java @@ -468,7 +468,8 @@ public class AlbumServlet if (cimg == null) { cimg = pictureScaler.scalePicture(file, thumbnail, size); thumbDb.store(key, cimg); - log.info(" " + key + " added to the cache with size " + cimg.bits.length + " -- now " + thumbDb.size() + " entries"); + int byteSize = cimg.bits != null ? cimg.bits.length : 0; + log.info(" " + key + " added to the cache with size " + byteSize + " -- now " + thumbDb.size() + " entries"); } res.setStatus(HttpServletResponse.SC_OK); res.setDateHeader("Last-Modified", file.lastModified()); diff --git a/src/main/java/org/forkalsrud/album/web/PictureScaler.java b/src/main/java/org/forkalsrud/album/web/PictureScaler.java index 529061c..4b6d81b 100644 --- a/src/main/java/org/forkalsrud/album/web/PictureScaler.java +++ b/src/main/java/org/forkalsrud/album/web/PictureScaler.java @@ -167,6 +167,13 @@ public class PictureScaler { } BufferedImage img = ImageIO.read(file); + if (img == null) { + CachedImage cimg = new CachedImage(); + cimg.lastModified = file.lastModified(); + cimg.mimeType = "image/jpeg"; + cimg.bits = new byte[0]; + return cimg; + } // The orientation is about flipping and rotating. Here is what an 'F' looks like // on pictures with each orientation. diff --git a/src/main/webapp/assets/render.js b/src/main/webapp/assets/render.js index e574dc5..cfa8d86 100644 --- a/src/main/webapp/assets/render.js +++ b/src/main/webapp/assets/render.js @@ -15,6 +15,15 @@ $(function() { } + function encUri(str) { + return encodeURI(str) + .replace(/%5B/g, "[") + .replace(/%5D/g, "]") + .replace(/[!'()*?&#]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); + } + function renderGrid(data, textStatus) { var container = $("#container"); @@ -34,7 +43,7 @@ $(function() { isWrapped = imgElement.parent().get()[0].tagName == "A", anchor = isWrapped ? imgElement.parent() : $(""); if (destination) { - anchor.attr("href", encodeURI("/photo/album" + destination + ".album") + location.search); + anchor.attr("href", encUri("/photo/album" + destination + ".album") + location.search); if (!isWrapped) { imgElement.wrap(anchor); } @@ -77,8 +86,8 @@ $(function() { var gridDiv = $("
\n" + " " + entry.name + "
\n" - + " \n" + + " \n" + "
\n"); var captionP = $("

\n"); @@ -134,7 +143,7 @@ $(function() { $("#search").on("submit", function () { - var searchStr = "?q=" + encodeURI($("#searchBox").val()); + var searchStr = "?q=" + encUri($("#searchBox").val()); history.pushState({ }, null, searchStr); $.getJSON(location.pathname.replace(/\.album(\?|$)/, '.json') + searchStr, renderGrid); return false;