boto有时会抛出Content-MD5错误

时间:2014-02-12 01:27:09

标签: python python-3.x amazon-s3 subprocess boto

所以我基本上编写了一个函数,使用key.set_contents_from_file()函数将文件上传到S3,但我发现它有时会抛出此错误

<Error>
<Code>BadDigest</Code>
<Message>The Content-MD5 you specified did not match what we received.</Message>    
<ExpectedDigest>TPCms2v7Hu43d+yoJHbBIw==</ExpectedDigest>
<CalculatedDigest>QSdeCsURt0oOlL3NxxGwbA==</CalculatedDigest>
<RequestId>2F0D40F29AA6DC94</RequestId><HostId>k0AC6vaV+Ip8K6kD0F4fkbdS13UdxoJ3X1M76zFUR/ZQgnIxlGJrAJ8BeQlKQ4m6</HostId></Error>

功能:

def uploadToS3(filepath, keyPath, version):
    bucket = connectToS3() # Simple gets my bucket and returns it

    key = Key(bucket)
    f = open(filepath,'r')

    key.name = keyPath
    key.set_metadata('version', version)
    key.set_contents_from_file(f)    # offending line
    key.make_public()
    key.close()

如果我打开一个python shell并手动调用它,它可以毫无障碍地工作,但是我必须处理它(它不起作用)的方式涉及从子进程调用它。这是因为调用者是一个python3脚本,2to3不起作用,我不想处理python3版本的各年历史。

无论如何,这似乎实际上正确运行它,因为它进入函数,输入是预期的(我打印出来),但#fending行继续抛出此错误。我不知道原因是什么。

铲斗是否可以正确设置?我觉得如果是这样的话,调用Key(存储桶)就会抛出错误

所以我基本上运行下面的脚本,一次作为从python3脚本调用的子进程,另一次从控制台调用

sudo -u www-data python botoUtilities.py uploadToS3 /path/to/file /key/path

我在里面有这个逻辑把它传递给正确的函数

func=None
args=[]

for arg in sys.argv[1:]:
    if not func:
        g = globals()
        func = g[arg]
    else:
        if arg=='True':
            args.append(True)
        elif arg=='False':
            args.append(False)
        else:
            args.append(arg)

if func:
    wrapper(func, args)

它在两种情况下运行(我写入文件以打印出args)但只有在控制台的情况下它才会收到错误。这令人难以置信地令人沮丧。我无法弄清楚做了什么不同的事情。我所知道的是,使用boto从子进程运行

是不可能将数据发送到S3的

0 个答案:

没有答案