#java #primefaces
Вопрос:
Мне нужно создать список файлов .pdf и обернуть все это в один zip-файл, используя org.primefaces.model.Потоковое недовольство. Возможно ли это??? Это моя общая идея:
private StreamedContent fileDownload;
private ArrayList<StreamedContent> filesDownload;
for (Cobranca boleto : cob) {
this.boletoPDF = null;
TndFabricaBoletoWrapper wrapper = new TndFabricaBoletoWrapper();
wrapper = this.cobrancaBusiness.processarBoleto(boleto, wrapper);
wrapper.setDownload(true);
JBoleto jBoleto = TndFabricaJBoleto.getJBoleto(wrapper);
jBoleto.addBoleto();
this.boletoPDF = jBoleto.closeBoleto();
File anexo = File.createTempFile("Boleto", ".pdf");
Arquivo.salvarArquivo(anexo, this.boletoPDF);
byte[] arq = Arquivo.zipByte(anexo, 9);
this.fileDownload = new DefaultStreamedContent(new ByteArrayInputStream(arq), "application/zip", "Boleto");
this.filesDownload.add(this.fileDownload);
}
((DefaultStreamedContent) this.filesDownload).setName("Boleto" ".zip"); //this is where the download action usually happens... But the (DefaultStreamdContent) cannot be cast to an ArrayList...
Ответ №1:
Что вам нужно сделать, это получить массив байтов каждого PDF-содержимого, добавить его в zip-файл, а затем создать потоковое содержимое этого Zip-файла.
Предположим, у вас есть список<байт[]> со всем вашим PDF-содержимым, это может быть что-то вроде этого:
public StreamedContent getZipDownload(List<byte[]> contentList){
StreamedContent result = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(baos);
for (int i = 0; i < contentList.size(); i ) {
String name = "" i ".pdf";
zipOut.putNextEntry(new ZipEntry(name));
zipOut.write(contentList.get(i));
zipOut.closeEntry();
}
zipOut.finish();
zipOut.close();
result = DefaultStreamedContent.builder()
.name("pdfFiles.zip")
.contentType("application/octet-stream")
.stream(() -> new ByteArrayInputStream(baos.toByteArray())).build();
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Download failed, error in Zip Creation", e);
}
return resu<
}
Комментарии:
1. Чувак, спасибо за помощь. Но из-за проблем с наследием я использую Primefaces 3.5, поэтому этот .builder() недоступен. Я пытаюсь настроить его, но это не совсем работает… На ваш ответ?
new ByteArrayInputStream(baos.toByteArray())).build()
, правильна ли переменная «baos»? Я имею в виду, что вы не передали ему никакой ценности…2. И вот заключительная часть моего кода, в которой у меня возникли некоторые проблемы
this.fileDownload = new DefaultStreamedContent(new ByteArrayInputStream(baos.toByteArray()), "application/octet-stream", "Boleto"); ((DefaultStreamedContent) this.fileDownload).setName("Boleto" ".zip");
3. Поток zipoutput создается из потока bytearrayoutput, поэтому мы пишем в него через поток zipoutput и baos. Функция toByteArray() возвращает байт[] с содержимым Zip-файла. Я думаю, что вам не нужно имя набора, вы можете использовать
DefaultStreamedContent(new ByteArrayInputStream(baos.toByteArray()), "application/octet-stream", "Boleto.zip");
, я не уверен, решит ли это ваши проблемы, я никогда не работал с primefaces 3.54. Я понимаю… К сожалению, у меня это не работает… ZIP отправляется для загрузки, но все PDF-файлы внутри сломаны…