in src/main/java/org/apache/sling/servlets/post/impl/helper/SlingFileUploadHandler.java [361:401]
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;
}