创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中

Posted

技术标签:

【中文标题】创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中【英文标题】:Create text file and add to zip file and download spring boot with out savind in local server 【发布时间】:2018-10-05 07:33:29 【问题描述】:

通过添加文本文件列表来创建和下载 zip 文件。无需在本地服务器中创建文件,应直接在客户端下载, 在这里我添加了一个代码 sn-p,它是在本地服务器中创建的,但我不希望这样,它应该在客户端即时创建和下载。请以这种方式帮助我..

@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】:

这是一个使用FileSystemResource的示例。

修改的是(见注释代码中的数字):

1) 声明响应的类型为 application/octet-stream

2)@ResponseBody

表示方法返回值的注解应该绑定到 网络响应正文

3) 声明该方法返回一个FileSystemResource body

4) 根据您创建的 zip 文件返回 FileSystemResource 实体

请注意,这仍会首先在服务器端创建文件,但您可能需要使用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");
        

    

【讨论】:

感谢您的快速回复.. 但我想直接在客户端下载而不在服务器端创建文件夹,请帮助我 有没有其他方法可以不用在服务器端创建直接下载 好吧,如果你想在内存中做所有事情,你可能想使用 ByteArrayOutputStream 作为 ZipOutputStream 的参数,然后返回一个从填充的字节数组中读取的 ResponseEntity&lt;ByteArrayResource&gt; (检索自ByteArrayOutputStream.toByteArray())。 其实我也不想在服务器端创建文本文件 有人知道答案吗?

以上是关于创建文本文件并添加到zip文件并下载spring boot而不保存在本地服务器中的主要内容,如果未能解决你的问题,请参考以下文章

从内存中的 url 下载图像并在内存中创建 zip 存档以发送到浏览器

Android 下载Zip文件,并解压到本地

在完成 zip 创建之前将 zip 内容发送到响应

将zip文件本地下载到tempfile,将文件解压到tempfile,并列出文件

创建一个包含动态生成的文件的 ZIP 文件

已添加具有相同密钥的项目 C# -Ionic.Zip