从http获取响应管理zip

时间:2016-05-06 07:11:35

标签: javascript java angularjs spring spring-mvc

我有这个问题:

我需要从服务器下载一个zip文件,此zip包含.xod和.png。 我正在使用Angular js,java spring来克服跨域问题,我的htt.get angular调用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:

  

对象{data:“UEsDBBQACAAIAA5IpkgAAAAAAAAAAAAAAAAJAAAAMTYwMzQucG ... AcqwpAGxvZ28ucG5nUEsFBgAAAAAIAAgAuwEAAMa / KQAAAA ==”,状态:200,配置:对象,statusText:“确定”}

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

感谢。

1 个答案:

答案 0 :(得分:0)

我搜索了一下,试图找到解决方案。我的疑问是:你在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,您可以返回未压缩文件的名称列表,或者返回hashmap,arraylist或仅列出的流和/或其fileName或您需要的任何内容。

List<String> fileNames 

HashMap<String, Object> filesStreams 
例如,

我对春天不太熟悉。返回List是否可行,或者你必须返回一个Buffer?如果你必须返回缓冲区告诉我,我会找到另一种解决方案。 ;)