Создайте текстовый файл, добавьте его в zip-файл и скачайте весеннюю загрузку без сохранения на локальном сервере. - PullRequest
0 голосов
/ 05 октября 2018

создать и скачать ZIP-файл, добавив список текстовых файлов.без создания файла на локальном сервере, его следует загружать на стороне клиента напрямую. Здесь я добавил фрагмент кода, он создавался на локальном сервере, но я не хочу этого, его следует создавать и загружать на стороне клиента мгновенно.Пожалуйста, помогите мне в этом ..

@GetMapping("/download/rawdata")
    public void downloadRawdata(@RequestParam("date") String date){

        log.info("date : "+date);
        List<Rawdata> rawdatas = rawdataRepoisotry.findRawdataByDate(date);
        log.info("size of rawdata : "+rawdatas.size());
        List<File> files = new ArrayList<File>();
        int i = 1;
        for(Rawdata rawdata : rawdatas){
        log.info("rawdata : "+ rawdata.getRawdata());
            File file = new File(i+".txt");

            try (Writer writer = new BufferedWriter(new FileWriter(file))) {
                String contents = rawdata.getRawdata(); 
                writer.write(contents);
                files.add(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }

        try {
            zipFile(files, new File(date+".zip"));
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Failed while creating Zip file");
        }

    }


    public FileOutputStream zipFile(final List<File> files, final File targetZipFile) throws IOException {
        try {
          FileOutputStream   fos = new FileOutputStream(targetZipFile);
          ZipOutputStream zos = new ZipOutputStream(fos);
          byte[] buffer = new byte[128];
          for(File currentFile : files){
                if (!currentFile.isDirectory()) {
                  ZipEntry entry = new ZipEntry(currentFile.getName());
                  FileInputStream fis = new FileInputStream(currentFile);
                  zos.putNextEntry(entry);
                  int read = 0;
                  while ((read = fis.read(buffer)) != -1) {
                    zos.write(buffer, 0, read);
                  }
                  zos.closeEntry();
                  fis.close();
                }
          }
          zos.close();
          fos.close();
          return fos;
        } catch (FileNotFoundException e) {
          System.out.println("File not found : " + e);
          throw new FileNotFoundException();
        }


      }

1 Ответ

0 голосов
/ 05 октября 2018

Вот пример использования FileSystemResource .

Что было изменено (см. Числа в коде с комментариями):

1) Объявите, что ответ будетбыть типа application / octet-stream

2) @ResponseBody

Аннотация, указывающая, что возвращаемое значение метода должно быть привязано к телу веб-ответа

3) Объявите, что метод возвращает FileSystemResource body

4) Верните сущность FileSystemResource, основанную на созданном вами zip-файле

Обратите внимание, что это все равно создаст файл насначала на стороне сервера, но вы можете использовать File.createTempFile и File.deleteOnExit .

    @GetMapping("/download/rawdata", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)//1
    @ResponseBody //2
    public ResponseEntity<FileSystemResource> downloadRawdata(@RequestParam("date") String date){ //3

        log.info("date : "+date);
        List<Rawdata> rawdatas = rawdataRepoisotry.findRawdataByDate(date);
        log.info("size of rawdata : "+rawdatas.size());
        List<File> files = new ArrayList<File>();
        int i = 1;
        for(Rawdata rawdata : rawdatas){
        log.info("rawdata : "+ rawdata.getRawdata());
            File file = new File(i+".txt");

            try (Writer writer = new BufferedWriter(new FileWriter(file))) {
                String contents = rawdata.getRawdata(); 
                writer.write(contents);
                files.add(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }

        try {

            File resultFile = new File(date+".zip");
            zipFile(files, resultFile);

            return new ResponseEntity<>(new FileSystemResource(resultFile), HttpStatus.OK); //4

        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Failed while creating Zip file");
        }

    }
...