当前位置: 首页 > 知识库问答 >
问题:

SpringRest-创造。压缩文件并将其发送到客户端

蒋正平
2023-03-14

我想创建. zip文件,其中包含我从后端收到的压缩文件,然后将此文件发送给用户。两天来,我一直在寻找答案,但找不到合适的解决方案,也许你可以帮我:)

目前,代码是这样的:(我知道我不应该在spring控制器中完成所有工作,但不关心这一点,它只是为了测试目的,以找到使其工作的方法)

    @RequestMapping(value = "/zip")
    public byte[] zipFiles(HttpServletResponse response) throws IOException{
        //setting headers
        response.setContentType("application/zip");
        response.setStatus(HttpServletResponse.SC_OK);
        response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");

        //creating byteArray stream, make it bufforable and passing this buffor to ZipOutputStream
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
        ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);

        //simple file list, just for tests
        ArrayList<File> files = new ArrayList<>(2);
        files.add(new File("README.md"));

        //packing files
        for (File file : files) {
            //new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
            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();
            IOUtils.closeQuietly(zipOutputStream);
        }
        IOUtils.closeQuietly(bufferedOutputStream);
        IOUtils.closeQuietly(byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }

但问题是,使用的代码,当我输入URL:localhost:8080/zip我得到文件:test.zip.html而不是. zip文件

我不知道我还能做什么。我还试着用以下内容替换tearrayouputstream:

OutputStream outputStream = response.getOutputStream();

并设置为无效的方法,所以它什么也不返回,但它创建了. zip文件,这是...损坏?

打开测试包后在我的macbook上。zip我正在接受测试。拉链cpgz再次给我测试。压缩文件等等。。

在窗户上。正如我所说,zip文件已损坏,甚至无法打开。

我也认为,自动删除. html扩展名将是最好的选择,但如何呢?希望它没有那么难,因为它似乎是:)谢谢

共有3个答案

孙熠彤
2023-03-14
@RequestMapping(value="/zip", produces="application/zip")
public ResponseEntity<StreamingResponseBody> zipFiles() {
    return ResponseEntity
            .ok()
            .header("Content-Disposition", "attachment; filename=\"test.zip\"")
            .body(out -> {
                var zipOutputStream = new ZipOutputStream(out);

                // create a list to add files to be zipped
                ArrayList<File> files = new ArrayList<>(2);
                files.add(new File("README.md"));

                // package files
                for (File file : files) {
                    //new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
                    zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
                    FileInputStream fileInputStream = new FileInputStream(file);

                    IOUtils.copy(fileInputStream, zipOutputStream);

                    fileInputStream.close();
                    zipOutputStream.closeEntry();
                }

                zipOutputStream.close();
            });
}
郝君博
2023-03-14
@RequestMapping(value="/zip", produces="application/zip")
public void zipFiles(HttpServletResponse response) throws IOException {

    //setting headers  
    response.setStatus(HttpServletResponse.SC_OK);
    response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");

    ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());

    // create a list to add files to be zipped
    ArrayList<File> files = new ArrayList<>(2);
    files.add(new File("README.md"));

    // package files
    for (File file : files) {
        //new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
        zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
        FileInputStream fileInputStream = new FileInputStream(file);

        IOUtils.copy(fileInputStream, zipOutputStream);

        fileInputStream.close();
        zipOutputStream.closeEntry();
    }    

    zipOutputStream.close();
}
夹谷野
2023-03-14

好像解决了。我替换了:

response.setContentType("application/zip");

与:

@RequestMapping(value = "/zip", produces="application/zip")

现在我明白了,很美。压缩文件:)

如果你们中有人有更好或更快的提议,或者只是想给一些建议,那就去吧,我很好奇。

 类似资料:
  • 问题内容: 我想创建.zip文件,其中包含我从后端收到的压缩文件,然后将此文件发送给用户。两天来我一直在寻找答案,找不到合适的解决方案,也许你可​​以帮我:) 现在,代码是这样的:(我知道我不应该在spring控制器中做所有的事情,但是不要在意,它只是出于测试目的,找到使其工作的方法) 但是问题是,当我输入URL:localhost:8080 / zip时,使用代码得到的文件是:test.zip.

  • 问题内容: 您好,我一直在尝试将文件从node.js发送到客户端。 我的代码有效,但是当客户端转到指定的url()时,它将流式传输文件。 从Google Chrome浏览器访问该文件可使文件(.mp3)在播放器中播放。 我的目标是让客户的浏览器下载文件,然后问客户他想在哪里存储文件,而不是在网站上流式传输。 问题答案: 您需要设置一些标题标志。 用下载代替流媒体;

  • 问题内容: 我知道Mule使用元素对数据的gzip压缩提供了极大的支持。但是客户端现在需要zip压缩,因为该文件必须作为zip压缩文件放在FTP上:( 在以下情况下,我在m子中遇到困难: 我创建了一个Spring bean,其中包含文件。我想使用ZipOutputStream类压缩此文件,并将其传递给我们的ftp。 这是我的流程配置: 这是我的zipCompressor的代码: 我编写了一个单元测

  • 问题内容: 我使用此功能将html文件发送到客户端,但是在客户端中我什么也没有得到(空白页),没有错误。我有什么问题吗?,请帮忙? 我的test.html文件 问题答案: 尝试这样的代码: 使用res.sendFile而不是手动读取文件,以便express可以为您正确设置内容类型。 您不需要这行,因为这是由express内部处理的。

  • 问题内容: 好吧,这里的问题很简单。我正在研究一个简单的备份代码。除非文件中有空格,否则它工作正常。这就是我查找文件并将其添加到tar存档中的方式: 问题是文件名中有空格,因为tar认为它是文件夹。基本上,有没有一种方法可以在find的结果周围添加引号?还是其他解决方法? 问题答案: 用这个: 它会: 处理带有空格,换行符,前导破折号和其他趣味的文件 处理无限数量的文件 当您有大量文件时,不会像使

  • 问题内容: 如标题所示,我需要将一些数据(从数据库中获取)放入Excel工作表中,然后将其发送到客户端,以便用户可以保存,打开或取消操作。 我看到了一些与此有关的文章,最近的是:如何让用户下载文件?(Java,MVC,Excel,POI)。参考史蒂文斯提供的链接,我尝试了以下代码: 首先这里没有定义。其次,我无法正确理解代码的工作方式。 我还找到了此链接:http : //www.roseindi