package br.com.caelum.vraptor.observer.download;
import static java.nio.file.Files.copy;
import static java.util.Arrays.asList;
import java.io.IOException;
import java.nio.file.Path;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletResponse;
/**
* Supports multiple files download as a zip file.
*
* @author Otávio Scherer Garcia
* @since 4.1
*/
public class ZipDownload implements Download {
private final String filename;
private final Iterable<Path> files;
public ZipDownload(String filename, Iterable<Path> files) {
this.filename = filename;
this.files = files;
}
public ZipDownload(String filename, Path... files) {
this(filename, asList(files));
}
@Override
public void write(HttpServletResponse response)
throws IOException {
response.setHeader("Content-disposition", "attachment; filename=" + filename);
response.setHeader("Content-type", "application/zip");
CheckedOutputStream stream = new CheckedOutputStream(response.getOutputStream(), new CRC32());
try (ZipOutputStream zip = new ZipOutputStream(stream)) {
for (Path file : files) {
zip.putNextEntry(new ZipEntry(file.getFileName().toString()));
copy(file, zip);
zip.closeEntry();
}
}
}
}