Как отправить динамически сгенерированный Zip-файл для загрузки в JS? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь сгенерировать zip-файл, добавив список файлов из пути к файлу.создание zip с использованием zipOutputStream и отправка его в javascript для загрузки файла по клику.Я пробовал разные способы сделать это, но не смог найти решение.Может ли кто-нибудь помочь в этом?Я новичок в кодировании на стороне Javascript.

Вот что я пытаюсь сделать:

Код контроллера:

@RequestMapping(value="/logsDownload", method=RequestMethod.POST)
    @Produces("application/zip")
    public @ResponseBody ResponseEntity <byte[]> zipFiles(Model model,@RequestBody String component,HttpServletRequest request) throws IOException{

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
        ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);
        String logFileLocation = "";
        ResponseEntity<byte[]> response = null;
        try {
            logFileLocation = devtestSupportProject.fetchLogs(component); // based on the component the file path will be decided
            File dir = new File(logFileLocation);
            File[] files = dir.listFiles();
            for (File file : files) {
                zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
                FileInputStream fileInputStream = new FileInputStream(file);
                IOUtils.copy(fileInputStream, zipOutputStream);
                fileInputStream.close();
                zipOutputStream.closeEntry();
            }

            if (zipOutputStream != null) {
                zipOutputStream.finish();
                zipOutputStream.flush();
                zipOutputStream.close();
            }
            bufferedOutputStream.close();
            byteArrayOutputStream.close();
            byte[] zipByteArray = byteArrayOutputStream.toByteArray();
            response = new ResponseEntity<byte[]>(zipByteArray, HttpStatus.OK);
        }catch(Exception exp) {
            logger.error(exp.getMessage(),exp);
            byte[] error = exp.getMessage().getBytes();
            response = new ResponseEntity<byte[]>(error, HttpStatus.SERVICE_UNAVAILABLE);       
        return response;
    }

Код Javascript:

$http.post("logsDownload",$scope.component, {responseType:'arraybuffer'}).then(function successCallback(response) {
                var blob = new blob([response], {'type':"application/zip"});
                var fileUrl = window.URL.createObjectURL(file);
                var filename = "logs.zip";
                var element = document.createElement("a");
                element.style.display = 'none';
                document.body.appendChild(element);
                element.href = fileURL;
                element.download = fileName;
                document.body.removeChild(element);             
            });
...