【问题标题】:Manage zip from http get response从 http 获取响应管理 zip
【发布时间】:2016-05-06 07:11:34
【问题描述】:

我有这个问题:

我需要从服务器下载一个 zip 文件,这个 zip 文件包含 .xod 和 .png。 我正在使用 Angular js、java spring 来克服跨域问题,我的 htt.get angular call java spring 控制器它实现了真正的 get 调用。 我必须下载 zip -> 将此 zip 返回到 angular,解压缩,提取文件并将其保存在 IndexedDB 中。

这是我的角度代码:

var req = {
             method: 'GET',
             url: CONTEXT_PATH+"/services/data/"+meetingId,
             headers: {
               'Content-Type': undefined
             }
    }

    $http(req).then(function(data){
        console.log("rest call done!");
        console.log(data);
    });

这是java spring代码:

@RequestMapping(value="/data/{meetingId}", method = RequestMethod.GET)
public Buffer getMeeting(@PathVariable(value="meetingId") String meetingId) {
    byte[] file = new byte[2048];
    Buffer buf =null;
    try {

        String url = getContentServer()+"/data?username="+getUsername()+"&password="+getPassword()+"&id="+meetingId;

        logger.info("start Rest template");
        RestTemplate templ = new RestTemplate();
        file = templ.getForObject(url, byte[].class);
        logger.info("PRE BUF");
        buf = ByteBuffer.wrap(file);
        logger.info("POST BUF");

    } catch (Exception e) {
        String msg = "Error retrieving meeting list";
        logger.error(msg, e);
    }
    logger.info("file zip  --> "+file.length);
    logger.info("buf --> "+buf+" -- buf.array --> "+ buf.array());
    return buf;
}

这是 console.log:

对象{数据:“UEsDBBQACAAIAA5IpkgAAAAAAAAAAAAAAAAJAAAAMTYwMzQucG…AcqwpAGxvZ28ucG5nUEsFBgAAAAAAIAAgAuwEAAMa/KQAAAA==”,状态:200,配置:对象,状态文本:“OK”}

我不知道我可以解码这个缓冲区并在客户端提取文件。

谢谢。

【问题讨论】:

    标签: javascript java angularjs spring spring-mvc


    【解决方案1】:

    我搜索了一下,试图找到一个解决方案。我的疑问是:你保存在dataBase中的数据是blob类型还是只保存文件的路径就可以了?

    因为我认为最好在服务器端这样做。我喜欢在服务器端工作,而在客户端工作得越少。因此,在搜索控制 zip 文件的 java 类时,我发现了这个: https://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipFile.html

    我在服务器端编写了(未经测试,因此可能会稍作修改):

    Enumeration<E> listEntries = zip.entries()
    
      for (listEntries; listEntries.hasMoreElements();) {
        ZipEntry item = getEntry(listEntries.nextElement().toString())
        InputStream fileStream = getInputStream(item)
      }
    

    使用该 InputStream,您可以返回未压缩文件的名称列表或哈希映射、数组列表或只是流列表和/或其文件名或您需要的任何内容。

    List<String> fileNames 
    

    HashMap<String, Object> filesStreams 
    

    例如。

    只是我对春天不是很熟悉。可以返回 List 还是必须返回 Buffer?如果您必须返回缓冲区,请告诉我,我会找到另一种解决方案。 ;)

    【讨论】:

    • 首先谢谢:)。实际上,我必须将此文件传递给 pdftron webviewer(角度侧)才能阅读它,并且我正在寻找可以做到这一点的东西,保存这个文件 insiede indexedDb 是一个想法,但实际上不是解决方案。我返回一个缓冲区,因为我无法将结果从弹簧返回到角度。我需要将此 zip 传递给 angular 并在客户端提取它,但实际上我无法做到。我很绝望
    • 我刚刚阅读了有关 webviewer 的内容,您需要的是实例化它的路径:pdftron.com/webviewer/demo/doc/symbols/… 但我的问题是您是否可以在该 spring 函数中返回 List 而不是 Buffer,所以您可以用每个文件来识别每个缓冲区,而不是只有一个缓冲区。如果你需要的是每个文件的缓冲区而不是 url。
    • 是的,我可以退货,我可以决定要退货的方法。
    • 如果您的问题是如何将字节放入文件中,您应该将 responseType: 'arraybuffer' 添加到您的 get 请求中。因此,当返回数据时,您将拥有:var arrayBuffer = data.data; if (arrayBuffer) { var byteArray = new Uint8Array(arrayBuffer); for (var i = 0; i &lt; byteArray.byteLength; i++) { // do something with each byte in the array } } 来源:developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/… 我虽然您的问题是您想要 zip 中的每个文件的流而不是 zip 流
    • 谢谢,我会尽快尝试,而不是java端是正确的?像我上面所做的那样,返回一个带有响应类型数组缓冲区的缓冲区?
    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2021-06-24
    • 2017-11-06
    • 1970-01-01
    • 2019-12-11
    相关资源
    最近更新 更多