+86 13541016684Mon. - Fri. 10:00-22:00

aws s3上传大文件的多种方法详解

aws s3上传大文件的多种方法详解

aws s3上传大文件的多种方法详解

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

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

s3put –bucket bicher –multipart –callback 5 pcre-8.32.zip
Copying /root/boto_aws/pcre-8.32.zip to bicher/root/boto_aws/pcre-8.32.zip
0 bytes transferred / 2030600 bytes total
507904 bytes transferred / 2030600 bytes total
1015808 bytes transferred / 2030600 bytes total
1523712 bytes transferred / 2030600 bytes total
2030600 bytes transferred / 2030600 bytes total

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

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

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

https://www.awsgood.com/?p=331

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

#!/usr/bin/env python

import math, os
import boto
from filechunkio import FileChunkIO

#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.
for i in range(chunk_count):
offset = chunk_size * i
bytes = min(chunk_size, source_size – offset)
with FileChunkIO(source_path, ‘r’, offset=offset, bytes=bytes) as fp:
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