diff --git a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java index 32eb4d3a7b..ffdeb483f7 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/ResourceRegionHttpMessageConverter.java @@ -40,6 +40,7 @@ import org.springframework.util.StreamUtils; * or Collections of {@link ResourceRegion ResourceRegions}. * * @author Brian Clozel + * @author Juergen Hoeller * @since 4.3 */ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessageConverter { @@ -58,7 +59,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa } else { Collection regions = (Collection) object; - if (regions.size() > 0) { + if (!regions.isEmpty()) { resource = regions.iterator().next().getResource(); } } @@ -141,6 +142,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa protected void writeResourceRegion(ResourceRegion region, HttpOutputMessage outputMessage) throws IOException { Assert.notNull(region, "ResourceRegion must not be null"); HttpHeaders responseHeaders = outputMessage.getHeaders(); + long start = region.getPosition(); long end = start + region.getCount() - 1; Long resourceLength = region.getResource().contentLength(); @@ -148,6 +150,7 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa long rangeLength = end - start + 1; responseHeaders.add("Content-Range", "bytes " + start + '-' + end + '/' + resourceLength); responseHeaders.setContentLength(rangeLength); + InputStream in = region.getResource().getInputStream(); try { StreamUtils.copyRange(in, outputMessage.getBody(), start, end); @@ -167,30 +170,43 @@ public class ResourceRegionHttpMessageConverter extends AbstractGenericHttpMessa Assert.notNull(resourceRegions, "Collection of ResourceRegion should not be null"); HttpHeaders responseHeaders = outputMessage.getHeaders(); + MediaType contentType = responseHeaders.getContentType(); String boundaryString = MimeTypeUtils.generateMultipartBoundaryString(); responseHeaders.set(HttpHeaders.CONTENT_TYPE, "multipart/byteranges; boundary=" + boundaryString); OutputStream out = outputMessage.getBody(); + for (ResourceRegion region : resourceRegions) { long start = region.getPosition(); long end = start + region.getCount() - 1; InputStream in = region.getResource().getInputStream(); - // Writing MIME header. - println(out); - print(out, "--" + boundaryString); - println(out); - if (contentType != null) { - print(out, "Content-Type: " + contentType.toString()); + try { + // Writing MIME header. println(out); + print(out, "--" + boundaryString); + println(out); + if (contentType != null) { + print(out, "Content-Type: " + contentType.toString()); + println(out); + } + Long resourceLength = region.getResource().contentLength(); + end = Math.min(end, resourceLength - 1); + print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); + println(out); + println(out); + // Printing content + StreamUtils.copyRange(in, out, start, end); + } + finally { + try { + in.close(); + } + catch (IOException ex) { + // ignore + } } - Long resourceLength = region.getResource().contentLength(); - end = Math.min(end, resourceLength - 1); - print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); - println(out); - println(out); - // Printing content - StreamUtils.copyRange(in, out, start, end); } + println(out); print(out, "--" + boundaryString + "--"); }