in src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java [358:396]
private File mergeChunks(final Resource parentResource, final InputStream lastChunkStream)
throws PersistenceException {
OutputStream out = null;
SequenceInputStream mergeStrm = null;
File file = null;
try {
file = File.createTempFile("tmp-", "-mergechunk");
out = new FileOutputStream(file);
String startPattern = SlingPostConstants.CHUNK_NODE_NAME + "_" + "0_";
Iterator<Resource> itr = new FilteringResourceIterator(parentResource.listChildren(), startPattern);
final Set<InputStream> inpStrmSet = new LinkedHashSet<>();
while (itr.hasNext()) {
final Resource rangeResource = itr.next();
if (itr.hasNext()) {
throw new PersistenceException("more than one resource found for pattern: " + startPattern + "*");
}
inpStrmSet.add(rangeResource.adaptTo(InputStream.class));
log.debug("added chunk {} to merge stream", rangeResource.getName());
String[] indexBounds = rangeResource
.getName()
.substring((SlingPostConstants.CHUNK_NODE_NAME + "_").length())
.split("_");
startPattern = SlingPostConstants.CHUNK_NODE_NAME + "_"
+ String.valueOf(Long.valueOf(indexBounds[1]) + 1) + "_";
itr = new FilteringResourceIterator(parentResource.listChildren(), startPattern);
}
inpStrmSet.add(lastChunkStream);
mergeStrm = new SequenceInputStream(Collections.enumeration(inpStrmSet));
IOUtils.copyLarge(mergeStrm, out);
} catch (final IOException e) {
throw new PersistenceException("Exception during chunk merge occured: " + e.getMessage(), e);
} finally {
IOUtils.closeQuietly(out);
IOUtils.closeQuietly(mergeStrm);
}
return file;
}