Spring REST - 创建 ZIP 文件并将其发送到客户端

2024-01-07

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

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

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

        // Creating byteArray stream, make it bufferable and passing this buffer 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 file.

当我删除时.html延长并保留test.zip它可以正确打开。所以我的问题是:

  • 如何避免退货.html扩大?
  • 为什么添加它?

我不知道我还能做什么。我也尝试更换ByteArrayOuputStream类似的东西:

OutputStream outputStream = response.getOutputStream();

并将方法设置为void所以它什么也没返回,但它创建了.zip哪个文件被损坏了?

打开包装后在我的 MacBook 上test.zip我正在得到test.zip.cpgz这再次给了我test.zip文件等。

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

我还认为,删除.html自动扩展将是最好的选择,但如何扩展呢?

希望它没有看起来那么难:)
Thanks


问题已经解决了。

我替换:

response.setContentType("application/zip");

with:

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

现在我得到了一个清晰、美丽的.zip file.


如果你们中的任何人有更好或更快的建议,或者只是想提供一些建议,那么请继续,我很好奇。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring REST - 创建 ZIP 文件并将其发送到客户端 的相关文章

随机推荐

  • 隐马尔可夫模型 (HMM) 中的三态电话模型

    我想问一下HMM中3态电话模型的含义 本案例基于语音识别系统中的HMM理论 因此 该示例基于 HMM 中语音的声学建模 我从期刊论文中得到了这张示例图片 http www intechopen com source html 41188 m
  • 如何在 Github Atom Editor 中同步多台计算机的包和设置

    我已经在我的个人电脑和办公室电脑上安装了 Github Atom Editor 我想将设置和软件包同步到我的 Dropbox 帐户 这样当我登录办公室电脑时 它会自动下载或更新所有软件包和设置到我的家庭电脑 您是否尝试过使用原子同步设置 h
  • CMU Sphinx 是否可以通过 Maven 获得?

    我有一个可能需要 CMU Sphinx 的应用程序的想法 它可以通过 Maven 获得 还是需要手动添加 更新 CMUSphinx 将在一周左右的时间内在 sonatype 中提供 Maven 支持已经提交到 sphinx4 trunk 中
  • go-git:创建本地分支的正确方法,模拟“git分支 ”的行为?

    正如标题所示 我试图弄清楚如何使用创建本地分支go git与 Git CLI 命令给出相同结果的方式git branch
  • 防止“冒泡”? [复制]

    这个问题在这里已经有答案了 我不确定这是否真的在冒泡 我会解释一下 我有这个 div div text here div div 如何绑定点击事件 使其仅影响所包含的 div 如果我这样设置 jQuery div bind click fu
  • 使用elasticsearch实施建议“类别中的xxx”

    我想对产品实施类似亚马逊的 类别内 建议 亚马逊建议在特定类别中搜索给定术语 而不是全局搜索 这允许更具体的搜索和结果 有没有办法使用elasticsearch提供的建议功能之一来实现这一点 目前我的想法是从elasticsearch获取建
  • mongoDB vs mySQL——为什么一个在某些方面比另一个更好[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 评估骰子滚动符号字符串

    Rules 编写一个接受字符串作为参数的函数 返回 表达式的评估值骰子记数法 http en wikipedia org wiki Dice notation 包括加法和乘法 为了澄清问题 这里是法律表达式的 EBNF 定义 roll po
  • 使用 Python 从文本中提取 IBAN

    我想用 Python 从文本中提取 IBAN 号码 这里的挑战是 IBAN 本身可以用多种方式编写 数字之间有空格 我发现很难将其转换为有用的正则表达式模式 我写了一个演示版 https regex101 com r PRDDaT 1它尝试
  • 使用 LINQ 进行编码是如何工作的?幕后发生了什么?

    例如 m lottTorqueTools From t In m lottTorqueTools Where Not t SlotNumber toolTuple SlotNumber And Not t StationIndex tool
  • java.lang.RuntimeException: android.database.sqlite.SQLiteException: 没有这样的表: media_store_extension (代码 1): ,

    我在 2021 年 10 月之后在 Play 商店上发布我的应用程序时遇到问题 错误表明该表media store extension不存在 问题是 我在项目中没有使用 SQLITE 所以我不知道是什么导致了这个异常 目标 sdk 是 30
  • 当单词不存在时,将 0 分配给某些单词

    这是我在 stackoverflow 上发表的第一篇文章 我对编码还比较陌生 所以 请耐心听我说 我正在做一个实验 有两组数据文档 文档1如下 TOPIC topic 0 5892 0 site 0 0371690427699 Intern
  • GLSL 着色器:在两个以上纹理之间进行插值

    我已经在 OpenGL 中实现了高度图 目前它只是一个正弦 余弦弯曲地形 目前我正在白色的 冰 和较暗的 石头 纹理之间进行插值 这是这样完成的 color mix texture2D ice layer tex texcoord text
  • 如何从给定的父节点获取所有子节点?

    我有一个父 子 ID 列表 并且希望获取给定父 ID 的所有子 ID 不存在空父级 顶级 ID 不会显示为子 ID 目前 父 子 ID 被记录为列表中的 KeyValuePair 但是如果更好的话 可以轻松更改为其他数据结构 List
  • aspnet 的最大值:MaxHttpCollectionKeys

    我有一个发布相当大数据的表单 但出现此错误 InvalidOperationException Operation is not valid due to the current state of the object System Web
  • JPanel 错误 - J 组件无法解析

    我有 JRE 系统库 JRE 1 8 x 库 我的线路出现错误 错误 无法解析类型 javax swing JComponent 它是从所需的 class 文件间接引用的 我怎样才能消除这个错误 这是屏幕截图 http i60 tinypi
  • 框架的私有模块映射

    我在用着这个答案 https stackoverflow com a 25250520 849645创建模块映射来为 CommonCrypto 创建模块 以便我可以在框架中使用它 然而 这样做意味着我使用此框架的任何项目都可以通过以下方式访
  • .NET 4.5 文件读取性能同步与异步

    我们正在尝试测量使用同步方法与异步方法读取一系列文件之间的性能 原本期望两者之间的时间大致相同 但结果发现使用异步大约慢 5 5 倍 这可能是由于管理线程的开销造成的 但只是想知道您的意见 也许我们只是测量了错误的时间 这些是正在测试的方法
  • 使用 INDEX/MATCH 进行三维查找

    这是从已被删除的问题中采取并稍微改进的 对于那些可以看到已删除帖子的人 该帖子摘自此处 https stackoverflow com questions 39793322 Three Dimensional lookup no conca
  • Spring REST - 创建 ZIP 文件并将其发送到客户端

    我想创建一个 ZIP 文件 其中包含从后端收到的存档文件 然后将此文件发送给用户 两天来我一直在寻找答案 但找不到合适的解决方案 也许你可以帮助我 目前 代码是这样的 我知道我不应该在 Spring 控制器中完成所有操作 但不要关心这一点