gpt4 book ai didi

java - 我可以在 vaadin 中直接流式传输 ZipFile 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:27 27 4
gpt4 key购买 nike

我的应用程序的当前架构不允许我在服务器端存储文件并创建指向该存储文件的链接。那么是否有任何其他选项(或代码片段)可以直接流式传输 ZipFile 并将其存储在客户端?

编辑:我想我的问题被误解了。我收到压缩文件并将其存储在客户端的答案。我已经做到了。以下是示例用例的主要关注点:

场景:用户有大约 5000 条记录(每条大约 1 MB)并且用户想要下载以 ZIP 格式压缩的每 5000 条记录的子记录(CSV 格式)。所有 CSV 文件都是即时生成的。

方法:由于 ZIP 文件的大小可达 5 GB,因此我采用了将文件内容直接流式传输到客户端创建的 ZIP 文件的方法。为此,我使用了 PipeInputStream 和 PipeOutputStream。

结果:由于我是 vaadin 的新手,我在上述方法中没有成功,因此寻找任何支持将 ZIP 文件(无论大小)直接流式传输到客户端的建议/代码片段。

我想我现在清楚了。

最佳答案

您的问题不清楚。始终在发布问题时进行一些研究。现在,问题来自您要流式传输某些 URL、文件共享、数据库的位置。您使用的 Vaadin 版本是 6< 还是 >6?

已编辑 问题分为两部分。

  1. 直接从网站下载 Zip 文件。以下是用于下载任何文件的示例代码片段。

    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.net.URL;

    import javax.servlet.annotation.WebServlet;

    import com.vaadin.annotations.Theme;
    import com.vaadin.annotations.VaadinServletConfiguration;
    import com.vaadin.server.FileDownloader;
    import com.vaadin.server.StreamResource;
    import com.vaadin.server.StreamResource.StreamSource;
    import com.vaadin.server.VaadinRequest;
    import com.vaadin.server.VaadinServlet;
    import com.vaadin.ui.Button;
    import com.vaadin.ui.UI;

    @SuppressWarnings("serial")
    @Theme("vaadintest")
    public class VaadintestUI extends UI {

    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = VaadintestUI.class)
    public static class Servlet extends VaadinServlet {
    }

    protected void init(VaadinRequest request) {
    Button downloadButton = new Button("Download Zip File");

    StreamResource myResource = createResource();
    FileDownloader fileDownloader = new FileDownloader(myResource);
    fileDownloader.extend(downloadButton);

    setContent(downloadButton);
    }

    private StreamResource createResource() {
    return new StreamResource(new StreamSource() {
    @Override
    public InputStream getStream() {

    BufferedInputStream in = null;
    ByteArrayOutputStream bao = null;
    try {
    in = new BufferedInputStream(
    new URL("http://www-us.apache.org/dist/commons/io/binaries/commons-io-2.5-bin.zip" + "")
    .openStream());
    byte[] buff = new byte[8000];
    int bytesRead = 0;
    bao = new ByteArrayOutputStream();

    while ((bytesRead = in.read(buff)) != -1) {
    bao.write(buff, 0, bytesRead);
    }

    } catch (Exception e) {
    e.printStackTrace();
    }
    return new ByteArrayInputStream(bao.toByteArray());

    }
    }, "somefile.zip");
    }

  2. 压缩巨大的 CSV 文件并下载

引用:Best Practices to Create and Download a huge ZIP (from several BLOBs) in a WebApp

在服务器端压缩和存储很容易。我不认为由于访问问题直接存储到客户端磁盘会更容易(使用 OutputStream 是可能的)。您可以在服务器端将其压缩并共享压缩文件的客户端链接(文件需要存储在 WebApp 文件夹中)。

此外,您还可以在压缩后使用输出流来下载它。下面是它的简单示例。

引用:http://www.mkyong.com/java/how-to-download-file-from-website-java-jsp/

编辑问题,给出实际场景:然后分享代码片段就很容易了

您可以引用的一些有用链接如下:

  1. Best Practices to Create and Download a huge ZIP (from several BLOBs) in a WebApp
  2. How to split a huge zip file into multiple volumes?
  3. Zip files with Java: Is there a limit?
  4. Very large zip file (> 50GB) --> ZipException: invalid CEN header
  5. Java multithreaded file downloading performance
  6. In Java: How to zip file from byte[] array?
  7. Uncompressing a ZIP file in memory in Java
  8. Best way to detect if a stream is zipped in Java

关于java - 我可以在 vaadin 中直接流式传输 ZipFile 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com