【问题标题】:Corrupted TAR File Error Upon Access From Google Cloud Storage in Java从 Java 中的 Google 云存储访问时损坏的 TAR 文件错误
【发布时间】:2021-10-18 11:34:22
【问题描述】:

我正在 Google Cloud Storage 中存储一个 TAR 文件。该文件可以通过gsutil 成功下载并使用 macOS 存档实用程序在我的计算机中提取。但是,我实现的 Java 程序在访问文件时总是遇到java.io.IOException: Corrupted TAR archive。我尝试了几种方法,所有方法都在使用org.apache.commons:commons-compress 库。你能告诉我如何解决这个问题或我可以尝试的东西吗?

以下是我尝试过的实现:

Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
blob.downloadTo(Paths.get("filename.tar"));
String contentType = blob.getContentType(); // application/x-tar

InputStream is = Channels.newInputStream(blob.reader());
String mime = URLConnection.guessContentTypeFromStream(is); // null
TarArchiveInputStream ais = new TarArchiveInputStream(is);
ais.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive

InputStream is2 = new ByteArrayInputStream(blob.getContent());
String mime2 = URLConnection.guessContentTypeFromStream(is2); // null
TarArchiveInputStream ais2 = new TarArchiveInputStream(is2);
ais2.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive

InputStream is3 = new FileInputStream("filename.tar");
String mime3 = URLConnection.guessContentTypeFromStream(is3); // null
TarArchiveInputStream ais3 = new TarArchiveInputStream(is3);
ais3.getNextEntry(); // raise java.io.IOException: Corrupted TAR archive

TarFile file = new TarFile(blob.getContent()); // raise java.io.IOException: Corrupted TAR archive
TarFile tarFile = new TarFile(Paths.get("filename.tar")); // raise java.io.IOException: Corrupted TAR archive

补充:我尝试从 GCS 解析 JSON 并且它工作正常。

Blob blob = storage.get(BUCKET_NAME, FILE_PATH);
JSONTokener jt = new JSONTokener(Channels.newInputStream(blob.reader()));
JSONObject jo = new JSONObject(jt);

【问题讨论】:

  • tar 文件可能使用了 Java tar 实现不支持的功能。我不知道这些特性(想想扩展权限、acls 等)是如何在 tar 中实现的,有些格式以向后兼容的方式实现,我不知道 tar 是否可以。我怀疑这实际上与 GCS 无关。您是否尝试过使用原始 tar 而不上传/下载它?
  • 我已尝试从本地目录通过FileInputStream 直接访问该tar 文件,但同样的错误仍然存​​在。我尝试通过运行命令$ tar -cvf <filename>.tar <random-dir> 创建一个归档到tar 中的随机文件,使用相同的FileInputStream 可以访问该tar 文件。我认为基于这些事实我们可以排除一些可能性,它不应该是由 Spring GCS 或 commons-compress 库引起的。 Here 是“损坏”的 tar 文件,如果它可能有助于检查的话。

标签: java google-cloud-platform google-cloud-storage tar archive


【解决方案1】:

问题是你的tar被压缩了,它是一个tgz文件。

因此,您需要在处理 tar 内容时解压缩文件。

请考虑以下示例;注意使用常见的 compress 内置 GzipCompressorInputStream 类:

public static void main(String... args) {
  final File archiveFile = new File("latest.tar");
  try (
      FileInputStream in = new FileInputStream(archiveFile);
      GzipCompressorInputStream gzIn = new GzipCompressorInputStream(in);
      TarArchiveInputStream tarIn = new TarArchiveInputStream(gzIn)
  ) {
    TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
    while (tarEntry != null) {
      final File path = new File("/tmp/" + File.separator + tarEntry.getName());
      if (!path.getParentFile().exists()) {
        path.getParentFile().mkdirs();
      }

      if (!tarEntry.isDirectory()) {
        try (OutputStream out = new FileOutputStream(path)){
          IOUtils.copy(tarIn, out);
        }
      }
      tarEntry = tarIn.getNextTarEntry();
    }
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多