Сделать файл Apache Poi Word доступным для загрузки по URL - PullRequest
0 голосов
/ 10 апреля 2019

Окончание кода poi:

response.setCharacterEncoding("UTF-8");
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("დოკუმენტი-" + loan.getLoanId() + ".zip", "UTF-8"));

File f = new File("autoloanagreement.docx");
FileOutputStream fileOutputStream = new FileOutputStream(f);

document.write(fileOutputStream);
fileOutputStream.close();
System.out.println("Success");

Я установил метод обработчика контроллера на produces = "application/zip" и всякий раз, когда я загружаю файл и пытаюсь открыть его, я получаю

Архив находится в неизвестном формате или поврежден

РЕДАКТИРОВАТЬ:

Я добавил новые строки кода и теперьzip-файл загружается и открывается, но я получаю новое сообщение об ошибке «Неожиданный конец zip-файла»

ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream(), Charset.forName("UTF-8"));

        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();

        DocumentSettingsPart dsp = wordMLPackage.getMainDocumentPart().getDocumentSettingsPart();
        org.docx4j.wml.CTSettings settings = Context.getWmlObjectFactory().createCTSettings();
        BooleanDefaultTrue val = new BooleanDefaultTrue();
        val.setVal(true);

        // Layout Settings
        org.docx4j.wml.CTCompat compat = Context.getWmlObjectFactory().createCTCompat();
        compat.setDoNotExpandShiftReturn(val);
        settings.setCompat(compat);
        dsp.setJaxbElement(settings);
        wordMLPackage.getMainDocumentPart().addTargetPart(dsp);

        File f = new File("AutoLoanAgreement");
        zipOutputStream.putNextEntry(new ZipEntry(f.getName()));
        wordMLPackage.save(f);
        FileInputStream fileInputStream = new FileInputStream(f);
        IOUtils.copy(fileInputStream, zipOutputStream);


        // დავხუროთ სტრიმი
        fileInputStream.close();
        zipOutputStream.closeEntry();

1 Ответ

1 голос
/ 10 апреля 2019

Вы отправляете файл в виде почтового индекса, но, кажется, никогда не заархивируете файл, который отправляете. Вы можете обернуть FileOutputStream в ZipOutputStream, например,

OutputStream out = new ZipOutputStream(new FileOutputStream(f));

Также кажется, что вы никогда не передаете файл в OutputStream ответа.

попробовать:

OutputStream os = new ZipOutputStream(response.getOutputStream());
document.write(os);
...