Mercurial > hg > digilib
changeset 1648:146c5f619e3c
implementing #7
* sents content-disposition filename for all files sent-as-is
* takes filename for generated images from "download-filename" hint
(but hint is not yet generated).
author | Robert Casties <casties@mpiwg-berlin.mpg.de> |
---|---|
date | Wed, 06 Sep 2017 17:46:43 +0200 |
parents | 2184c0ef4b30 |
children | 8cd7d396de93 |
files | common/src/main/java/digilib/image/DocuImageImpl.java servlet/src/main/java/digilib/servlet/ServletOps.java |
diffstat | 2 files changed, 61 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- a/common/src/main/java/digilib/image/DocuImageImpl.java Wed Sep 06 17:42:20 2017 +0200 +++ b/common/src/main/java/digilib/image/DocuImageImpl.java Wed Sep 06 17:46:43 2017 +0200 @@ -30,6 +30,7 @@ import java.awt.Rectangle; import java.io.IOException; import java.io.OutputStream; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -71,7 +72,7 @@ protected ImageInput input; /** image specific hints */ - protected Map<String, Object> hints; + protected Map<String, Object> hints = new HashMap<String, Object>(); /** * Returns the version.
--- a/servlet/src/main/java/digilib/servlet/ServletOps.java Wed Sep 06 17:42:20 2017 +0200 +++ b/servlet/src/main/java/digilib/servlet/ServletOps.java Wed Sep 06 17:46:43 2017 +0200 @@ -267,13 +267,14 @@ public static void sendFile(File f, String mt, String name, HttpServletResponse response, Logger logger) throws ImageOpException, IOException { logger.debug("sendRawFile(" + mt + ", " + f + ")"); - if (response == null) { - logger.error("No response!"); - return; - } - /* - * set content-type - */ + if (response == null) { + logger.error("No response!"); + return; + } + + /* + * set content-type + */ if (mt == null) { // auto-detect mime-type mt = FileOps.mimeForFile(f); @@ -282,34 +283,44 @@ } } response.setContentType(mt); + + /* + * set content-disposition with filename. + * uses image filename. + */ + if (name == null) { + // no download name -- use filename + name = f.getName(); + } if (mt.startsWith("application")) { - if (name == null) { - // no download name -- use filename - name = f.getName(); - } - response.addHeader("Content-Disposition", "attachment; filename=\""+name+"\""); + response.addHeader("Content-Disposition", "attachment; filename=\"" + name + "\""); + } else { + response.addHeader("Content-Disposition", "inline; filename=\"" + name + "\""); } /* - * set CORS header ACAO "*" for image response - */ - if (corsForImageRequests) { - // TODO: would be nice to check request for Origin header - response.setHeader("Access-Control-Allow-Origin", "*"); - } + * set CORS header ACAO "*" for image response + */ + if (corsForImageRequests) { + // TODO: would be nice to check request for Origin header + response.setHeader("Access-Control-Allow-Origin", "*"); + } /* * open file */ - FileInputStream inFile = null; + FileInputStream inFile = null; try { inFile = new FileInputStream(f); OutputStream outStream = response.getOutputStream(); - // TODO: should we set content length? + // TODO: should we set content length? // see http://www.prozesse-und-systeme.de/servletFlush.html - response.setContentLength( (int) f.length()); + response.setContentLength((int) f.length()); byte dataBuffer[] = new byte[4096]; int len; + /* + * write file to stream + */ while ((len = inFile.read(dataBuffer)) != -1) { // copy out file outStream.write(dataBuffer, 0, len); @@ -352,17 +363,16 @@ * @throws ImageOpException * @throws ServletException Exception on sending data. */ - public static void sendImage(DocuImage img, String mimeType, HttpServletResponse response, Logger logger) - throws ImageOpException, ServletException { - if (response == null) { - logger.error("No response!"); - return; - } - logger.debug("sending to response. committed=" + response.isCommitted()); + public static void sendImage(DocuImage img, String mimeType, HttpServletResponse response, Logger logger) + throws ImageOpException, ServletException { + if (response == null) { + logger.error("No response!"); + return; + } try { /* - * determine the content-type: if mime type is set use that - * otherwise if source is JPG then dest will be JPG else it's PNG + * determine the content-type: if mime type is set use that otherwise if source + * is JPG then dest will be JPG else it's PNG */ if (mimeType == null) { mimeType = img.getMimetype(); @@ -372,47 +382,44 @@ mimeType = "image/jpeg"; } } - if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") || - mimeType.equals("image/fpx"))) { + if ((mimeType.equals("image/jpeg") || mimeType.equals("image/jp2") || mimeType.equals("image/fpx"))) { mimeType = "image/jpeg"; } else { mimeType = "image/png"; } // set the content type response.setContentType(mimeType); - // check content type - String respType = response.getContentType(); - if (! mimeType.equals(respType)) { - // this shouldn't happen - logger.error("Crap! ServletResponse lost content type! ["+respType+"] Aborting!"); - // TODO: would this even help? - response.getOutputStream().close(); - return; + + /* + * set content-disposition with filename. + * uses filename provided in DocuImage. + */ + String name = (String) img.getHint("download-filename"); + if (name != null) { + response.addHeader("Content-Disposition", "inline; filename=\"" + name + "\""); } - /* - * set CORS header ACAO "*" for image response - */ - if (corsForImageRequests) { - // TODO: would be nice to check request for Origin header - response.setHeader("Access-Control-Allow-Origin", "*"); - } + * set CORS header ACAO "*" for image response + */ + if (corsForImageRequests) { + // TODO: would be nice to check request for Origin header + response.setHeader("Access-Control-Allow-Origin", "*"); + } /* * write the image */ OutputStream outstream = response.getOutputStream(); img.writeImage(mimeType, outstream); - + } catch (IOException e) { throw new ServletException("Error sending image:", e); - } finally { - img.dispose(); - } + } finally { + img.dispose(); + } } - /** * Returns IIIF compatible image information as application/json response. *