public void doDownload(HttpServletRequest req, HttpServletResponse resp, int hc) throws IOException { FileTransfer ft = FileTransfer.get(hc); if (ft == null) { resp.sendError(HttpServletResponse.SC_NOT_FOUND); return; } resp.setContentType(ft.mimeType); if (ft.size > 0) resp.setContentLength((int) ft.size); /*if (ft.filename != null) { resp.setHeader("Content-Disposition", (ft.inline ? "inline" : "attachment") + ";filename=" + ft.filename); }*/ resp.setHeader( "Content-Disposition", (ft.inline ? "inline" : "attachment") + (ft.filename != null ? ";filename=" + ft.filename : "")); if (ft.size < 0) resp.setHeader("Transfer-Encoding", "chunked"); else resp.setHeader("Content-Transfer-Encoding", "binary"); resp.setHeader("Expires", "0"); resp.setHeader("Cache-Control", "must-revalidate"); InputStream in = null; OutputStream out = null; try { in = ft.getInputStream(); out = resp.getOutputStream(); boolean te = ft.size < 0; byte[] buffer = new byte[4096]; while (true) { int n = in.read(buffer); if (n <= 0) break; if (te) { out.write(Integer.toHexString(n).getBytes()); out.write(13); out.write(10); } out.write(buffer, 0, n); if (te) { out.write(13); out.write(10); } } if (te) out.write("0\r\n\r\n".getBytes()); out.flush(); } catch (Error er) { logger.log(Level.SEVERE, er.getLocalizedMessage()); } finally { if (in != null) in.close(); if (out != null) out.close(); } }