首页 > 解决方案 > tar.gz 的 Linux 拆分在加入时运行良好,但在 S3 存储桶的帮助下转移到远程机器时

问题描述

我有几个文件,我做了 tar.gz。
由于这个文件可能会变得太大,因此我使用了 Linux 拆分。由于这需要转移到另一台机器上,我使用 s3 存储桶来传输这些文件。我使用 application/octet-stream content-type 来上传这些文件。下载的文件显示与原始大小完全相同的大小,因此不会丢失任何字节。

现在,当我这样做时cat downloaded_files_* > tarball.tar.gz,大小与原始文件完全相同,但只有带有 _aa 的部分被提取。

我检查了文件的类型

file downloaded_files_aa

这是 tar zip 文件(gzip compressed data, from Unix, last modified: Sun May 17 15:00:41 2020) 但所有其他文件都是data文件

我想知道如何获取文件。

注意:通过 API 网关进行 Http 上传以将文件上传到 s3

================================ 只是把我的调试结果放在希望它可能会帮助面临同样问题的人。

由于我们想使用 API 网关,所以上传调用是通过 http 调用完成的。这是不使用常规 aws sdk 的东西。

https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 代码示例:https://docs.aws.amazon.com/AmazonS3/latest/API/samples/AWSS3SigV4JavaSamples。压缩

经过一些调试,我们发现这条腿工作正常。

由于我们要下载文件的机器可以直接访问 s3,因此我们使用 aws sdk 下载文件。这是 URL https://docs.aws.amazon.com/AmazonS3/latest/dev/RetrievingObjectUsingJava.html

此代码无法正常工作,尽管它显示了确切的文件大小下载,因为上传文件丢失了一些信息。该代码还抱怨仍有待处理的字节。进行了一些更改以消除错误,但从未奏效。

我在这里找到的代码就像魔术一样工作

InputStream reader = new BufferedInputStream(
object.getObjectContent());
File file = new File("localFilename");      
OutputStream writer = new BufferedOutputStream(new FileOutputStream(file));

int read = -1;

while ( ( read = reader.read() ) != -1 ) {
    writer.write(read);
}

writer.flush();
writer.close();
reader.close();

此代码还使下载速度比我们以前的方法快得多。

标签: linuxamazon-s3

解决方案


推荐阅读