aws s3 上对存储的数据容量是没有限制的,各个 Amazon S3 数据元的大小可在 1 字节至 5 TB 之间,可在单个 PUT 中上传的最大数据元为 5 GB,对于大于 100 MB 的数据元,官方建议是要采用分段上传的方式,所以如果你有很大的文件要上传到S3上,而目前还不知道采用哪种方式最好,今天这篇文章我们就是专门来讨论如何把一个大文件上传到S3上的,经过我自己汇总,S3对上传大文件有四种方式,以下我们分别介绍:

1、第一种,用命令行方式上传,采用s3put命令进行上传:

s3put--bucketbicher--multipart--callback5pcre-8.32.zip
Copying/root/boto_aws/pcre-8.32.ziptobicher/root/boto_aws/pcre-8.32.zip
0bytestransferred/2030600bytestotal
507904bytestransferred/2030600bytestotal
1015808bytestransferred/2030600bytestotal
1523712bytestransferred/2030600bytestotal
2030600bytestransferred/2030600bytestotal

参数介绍,–bucket 后跟的是要上传的bucket名称,–multipart是支持多块上传,注意这个参数s3put默认是没有的,需要安装filechunkio 模块,用

pip install filechunkio 进行安装,安装完后就可以到这个参数选项了,–callback是回调函数,后面跟分几次进行上传,这个参数起到回显的功能,可以看到一个大文件分别上传到多少bytes,如果参数省略也可以上传成功,就是没有任何回显了。

2、第二种也是采用命令行方式,可以用s3cmd上传,因为这个命令我之前已经有详细介绍,今天就不在重复介绍了,可以在这里查看详细使用方法:

http://www.mindg.cn/?p=331

3、api方式,如果你觉得命令行方式用的不过瘾,就想用代码实现,也是可以的,其实aws针对大数据上次,也基本提供的是api接口模式,就是调用aws的api接口把文件分块上传到服务器上,然后服务器再把每个块组合成一个大的文件,这样的好处是如果传输中间网络断掉了,下次还可以根据传输的块编号进行续传,这就是基本原理,代码我是采用官方的例子,大家如果要用,可以根据自己的情况自行修改:

#!/usr/bin/env python
importmath,os
importboto
fromfilechunkioimportFileChunkIO
#Connect to S3
c=boto.connect_s3()
b=c.get_bucket('mybucket')
# Get file info
source_path='path/to/your/file.ext'
source_size=os.stat(source_path).st_size
#Create a multipart upload request
mp=b.initiate_multipart_upload(os.path.basename(source_path))
# Use a chunk size of 50 MiB (feel free to change this)
chunk_size=52428800
chunk_count=int(math.ceil(source_size/float(chunk_size)))
# Send the file parts, using FileChunkIO to create a file-like object
# that points to a certain byte range within the original file. We
# set bytes to never exceed the original file size.
foriinrange(chunk_count):
offset=chunk_size *i
bytes=min(chunk_size,source_size-offset)
withFileChunkIO(source_path,'r',offset=offset,bytes=bytes)asfp:
mp.upload_part_from_file(fp,part_num=i+1)
# Finish the upload
mp.complete_upload()

4、使用适用于分段上传的 REST API,官方介绍:

http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/mpUploadInitiate.html

针对s3上传到文件的方式就写到这里里,这4种方式肯定沟通用了,各位看官可以根据自己业务实际情况进行选择,今天就到这里,如有问题,请各位看官斧正。