所以我基本上编写了一个函数,使用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的