java - 如何使用 Java 从 KML 即时创建 KMZ 文件

标签 java playframework zip kml kmz

我正在尝试从 kml 文件动态创建 kmz 文件,并将其呈现为 Web 应用程序中的字节流。

但是当我下载生成的 kmz 文件时,我无法使用 Ubuntu 上的存档管理器打开它。

我在此网站上查看了类似的问题,但不起作用。

有人可以帮助我并解释我做错了什么吗?!

这是我的代码。

@Public public void retrieveKmlInOldFormat() {
   File file = new File(Play.applicationPath+"/"+Play.configuration.getProperty("web.content", "../bspb-web")+"/map/map.kml");
   String kmlFileContent = null;
   try {
     String kmlUrl = file.toURI().toURL().toString();
     kmlFileContent = BSPBKml2OldFormatConverter.toOldKml(
                        kmlParserLocal.load(kmlUrl));
   } catch (MalformedURLException e) {
      e.printStackTrace();
   }
   String zippedFileName = "old_fmt_map.kmz";
   String zippedKml = compressKmlFile(kmlFileContent,zippedFileName);
   response.setContentTypeIfNotSet("application/vnd.google-earth.kmz");
   renderBinary(new ByteArrayInputStream(zippedKml.getBytes()),zippedFileName);
   return;
}

压缩方法代码:

private String compressKmlFile(String kmlFileContent,String zipEntryName){

String zippedContent = null;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

ZipOutputStream zipStream = new ZipOutputStream(new
  BufferedOutputStream(byteStream));

ZipEntry zipEntry = null;
zipEntry = new ZipEntry("doc.kml");
try {
  zipEntry.setSize(kmlFileContent.getBytes("UTF-8").length);
  zipStream.putNextEntry(zipEntry);
  zipStream.write(kmlFileContent.getBytes("UTF-8"));
  zipStream.closeEntry();      
  zippedContent = new String(byteStream.toByteArray(),"UTF-8");
} catch (IOException e) {
  logger.error("Error while zipping kml file content");
}
finally {
  try {
    byteStream.close();
    zipStream.close();
  } catch (IOException e) {
    logger.error(e.getMessage());
  }
}
return zippedContent;
}

最佳答案

问题在于下载的 kmz 存档已损坏。这个问题可以通过使用http响应的输出流作为ZipOutputStream类的构造函数参数来解决。

解决方案在这段代码中。

@Public public void retrieveKmlInOldFormat(){
 File file = new File(Play.applicationPath+"/"+Play.configuration.getProperty("web.content", "../bspb-web")+"/map/map.kml");
 String kmlFileContent = null;
 try {
   String kmlUrl = file.toURI().toURL().toString();
   kmlFileContent = BSPBKml2OldFormatConverter.toOldKml(kmlParserLocal.load(kmlUrl));
 } catch (MalformedURLException e) {
   e.printStackTrace();
 }
 response.setContentTypeIfNotSet("application/vnd.google-earth.kmz");
 response.setHeader("Content-Disposition", "attachment; filename=\"old_fmt_map.kmz\"");
 renderAsKmz(response, kmlFileContent,"old_fmt_map.kml");
 return;
}



private void renderAsKmz(Response response,String kmlFileContent,String zipEntryName){
 ZipOutputStream zipStream = new ZipOutputStream(response.out);
 ZipEntry zipEntry = new ZipEntry(zipEntryName);
 try {
  zipStream.putNextEntry(zipEntry);
  zipStream.write(kmlFileContent.getBytes());
 } catch (IOException e) {
   logger.error("Error while zipping kml file content : " + e.getMessage());
 }
 finally {
   try {
     zipStream.closeEntry();
     zipStream.close();
   } catch (IOException e) {
    logger.error("Error while closing zipped stream : " + e.getMessage());
  }
}

关于java - 如何使用 Java 从 KML 即时创建 KMZ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33589304/

相关文章:

scala - 缓存 Slick DBIO 操作

playframework - 从生产环境中的Play框架中的公用文件夹读取文件

jakarta-ee - 就是玩!框架是在 Digitalocean 中为 VPS 制作应用程序的不错选择吗?

ruby - 为什么二进制文件在压缩时会损坏?

python - 无法解压通过 Flask 应用程序中的请求检索到的文件

java - FilenameFilter 产生神秘结果

java - 交换数组中的元素

java - 在 Java 中模拟类似日历的数据库的好方法是什么?

java - ThreadLocal共享数据?

php - PHP 中的 ZipArchive 问题 "Error 21 - Is a Directory"