3

我在 python 脚本中使用 boto。完成所有设置后,我试图通过比较磁盘上文件的大小与实际写入 S3 的字节数来查看上传到 S3 是否成功。

(顺便说一句,如果有更好的方法来确认上传成功,我很乐意知道。)

我下降到 Python 命令行并重新产生了我的问题。连接到 S3 等后,我这样做了:

>>> bytes = os.path.getsize('file.zip')
>>> key = bucket.new_key('file.zip')
>>> bytesWritten = key.set_contents_from_filename('file.zip')
>>> bytesWritten is None
True

文档说set_contents_from_filename()函数应该返回写入 S3 的字节数。为什么呢None

(我使用的是 boto 2.8.0,是的,该文件存在并且bytes超过 200k ......我检查了。)

4

1 回答 1

3

我目前不确定为什么set_contents_from_filename返回 None 值。快速查看代码表明它至少试图返回写入的字节数。我将不得不进行一些测试,看看我是否可以重现它。

但是,如果检查字节的目的是尝试验证对 S3 的写入操作是否成功完成,那么 boto 中已经内置了更强大的完整性检查。在上传文件之前,会计算 MD5 校验和。这作为请求中的Content-MD5标头发送。作为响应,S3 发送一个ETag标头,其中包含在服务端为上传内容计算的 MD5 校验和。Boto 对它们进行比较,如果它们不匹配,则引发异常。

于 2013-04-04T18:16:01.063 回答