private void handlePartialPlayback( HttpServletRequest request, HttpServletResponse response, Vertex artifactVertex, String fileName, User user) throws IOException { String type = getRequiredParameter(request, "type"); InputStream in; Long totalLength = null; long partialStart = 0; Long partialEnd = null; String range = request.getHeader("Range"); if (range != null) { response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); Matcher m = RANGE_PATTERN.matcher(range); if (m.matches()) { partialStart = Long.parseLong(m.group(1)); if (m.group(2).length() > 0) { partialEnd = Long.parseLong(m.group(2)); } } } response.setCharacterEncoding(null); response.setContentType(type); response.addHeader("Content-Disposition", "attachment; filename=" + fileName); StreamingPropertyValue mediaPropertyValue = getStreamingPropertyValue(artifactVertex, type); totalLength = mediaPropertyValue.getLength(); in = mediaPropertyValue.getInputStream(); if (partialEnd == null) { partialEnd = totalLength; } // Ensure that the last byte position is less than the instance-length partialEnd = Math.min(partialEnd, totalLength - 1); long partialLength = totalLength; if (range != null) { partialLength = partialEnd - partialStart + 1; response.addHeader( "Content-Range", "bytes " + partialStart + "-" + partialEnd + "/" + totalLength); if (partialStart > 0) { in.skip(partialStart); } } response.addHeader("Content-Length", "" + partialLength); OutputStream out = response.getOutputStream(); copy(in, out, partialLength); response.flushBuffer(); }