S3可以支持流式上传。例如,请参见此处:
http://blog.odonnell.nu/posts/streaming-uploads-s3-python-and-poster/
我的问题是,我是否可以在上传开始时不必指定文件长度来完成相同的事情?
http://blog.odonnell.nu/posts/streaming-uploads-s3-python-and-poster/
我的问题是,我是否可以在上传开始时不必指定文件长度来完成相同的事情?
S3允许最多10,000个部分,因此选择5MiB的部分大小可以上传高达50GiB的动态文件。对于大多数用例来说应该足够了。
但是:如果您需要更多,则必须增加部分大小。可以通过使用更高的部分大小(例如10MiB)或在上传过程中增加部分大小来实现。
First 25 parts: 5MiB (total: 125MiB)
Next 25 parts: 10MiB (total: 375MiB)
Next 25 parts: 25MiB (total: 1GiB)
Next 25 parts: 50MiB (total: 2.25GiB)
After that: 100MiB
这将使您能够上传高达1TB的文件(目前S3单个文件的限制为5TB),而不会浪费不必要的内存。
他的问题与你的不同 - 他在上传之前知道并使用Content-Length。他希望在这种情况下进行改进:许多库通过将文件中的所有数据加载到内存中来处理上传。伪代码如下:
data = File.read(file_name)
request = new S3::PutFileRequest()
request.setHeader('Content-Length', data.size)
request.setBody(data)
request.send()
Content-Length
,然后将数据从磁盘流式传输到请求流中。伪代码如下:upload = new S3::PutFileRequestStream()
upload.writeHeader('Content-Length', File.getSize(file_name))
upload.flushHeader()
input = File.open(file_name, File::READONLY_FLAG)
while (data = input.read())
input.write(data)
end
upload.flush()
upload.close()
为了帮助他人,将这个答案放在这里:
如果您不知道要流式上传到S3的数据长度,可以使用 S3FileInfo
及其 OpenWrite()
方法将任意数据写入S3。
var fileInfo = new S3FileInfo(amazonS3Client, "MyBucket", "streamed-file.txt");
using (var outputStream = fileInfo.OpenWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
streamWriter.WriteLine("Hello world");
// You can do as many writes as you want here
}
}
$ tar -czf - <my_dir/> | gof3r put --bucket <s3_bucket> --key <s3_object>
tar -czf - <my_dir/> | aws s3 --something-or-other
? - user11810894参考链接:https://github.com/aws/aws-cli/pull/903
以下是简介: 要将stdin流上传到s3,请使用: aws s3 cp - s3://my-bucket/stream
要将s3对象下载为stdout流,请使用: aws s3 cp s3://my-bucket/stream -
例如,如果我有对象s3://my-bucket/stream,我可以运行此命令: aws s3 cp s3://my-bucket/stream - | aws s3 cp - s3://my-bucket/new-stream
我的命令:
echo "ccc" | aws --endpoint-url=http://172.22.222.245:80 --no-verify-ssl s3 cp - s3://test-bucket/ccc
更多关于HTTP多部分实体请求的信息,请参考。您可以将文件作为数据块发送到目标。