S3:如何在不下载完整文件的情况下进行部分读/读?

jm3*_*jm3 24 http amazon-s3 http-headers

虽然它们类似于文件,但是Amazon S3中的对象并不是真正的"文件",就像S3存储桶不是真正的目录一样.在Unix系统上,我可以使用它head来预览文件的前几行,无论它有多大,但我不能在S3上执行此操作.那么如何对S3进行部分阅读呢?

jm3*_*jm3 44

S3文件可能很大,但你不必只是为了读取前几个字节而获取整个文件.S3 API支持HTTP Range:(请参阅RFC 2616),它采用字节范围参数.

只需Range: bytes=0-NN在S3请求中添加一个标头,其中NN是要读取的请求字节数,您只需获取那些字节而不是读取整个文件.现在,您可以预览在S3存储桶中保留的900 GB CSV文件,而无需等待整个内容下载.阅读完整的GET Object文档在亚马逊的开发者文档.

  • 示例S3调用:aws s3api get-object --bucket my_bucket --key path/to/my/file/file1.gz file1.gz --range bytes = 1000-2000 (8认同)
  • 在您的示例中,最好使用“Range: bytes=KN”,因为您可以从与“0”不同的值开始(请参阅@Rick W的答案)。 (2认同)

lam*_*bda 8

get_object api 有用于部分读取的 arg

s3 = boto3.client('s3')
resp = s3.get_object(Bucket=bucket, Key=key, Range='bytes={}-{}'.format(start_byte, stop_byte-1))
res = resp['Body'].read()
Run Code Online (Sandbox Code Playgroud)


小智 5

AWS .Net SDK仅显示可能的固定范围(RE :)public ByteRange(long start, long end)。如果我想从中间开始并读到结尾怎么办?HTTP范围Range: bytes=1000-对于“从1000开始并读到结束”是完全可以接受的,我认为他们在.Net库中不允许这样做。

  • @Mark 你的评论也没有帮助。 (2认同)