使用python将多个文件发送到aws s3时出错

时间:2018-02-04 19:02:34

标签: python amazon-web-services amazon-s3

我正在使用Raspberry Pi和python学习AWS IoT。我遇到的问题如下:

在事件检测的主要功能中,拍摄了一张照片并保存在Pi上。保存图片后,调用函数store_to_bucket,我传递两个参数:存储图片的路径和日期字符串。第一次一切正常。第二个函数调用给出了以下错误:

ClientError:调用PutObject操作时发生错误(AuthorizationHeaderMalformed):授权标头格式错误;必须在凭证中提供非空的访问密钥(AKID)。

代码

ACCESS_KEY_ID   =   open("/mykey/path/key.txt", "r")
ACCESS_SECRET_KEY = open("/mykey/path/skey.txt", "r")
BUCKET_NAME =   open("/mykey/path/bucket.txt", "r").read()

data = open(path, 'rb') 
    ext = '.jpg'    

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID.read(),
    aws_secret_access_key=ACCESS_SECRET_KEY.read(),
    config=Config(signature_version='s3v4')
)

def store_to_bucket(path, date):
    s3.Bucket(BUCKET_NAME).put_object(Key=date+ext, Body=data)
    print ("Done")

不确定凭据有什么问题?有没有人遇到类似的问题或知道如何解决它?

通过修复一些代码找到我的问题的解决方案。以下更新版本:

import boto3
from botocore.client import Config

ACCESS_KEY_ID = open("/home/pi/Desktop/pythonForAWS/certs/key.txt", 
"r").read()

ACCESS_SECRET_KEY = open("/home/pi/Desktop/pythonForAWS/certs/skey.txt", 
"r").read()

BUCKET_NAME = open("/home/pi/Desktop/pythonForAWS/certs/bucket.txt", 
"r").read()

def store_to_bucket(path, date):

    data = open(path, 'rb')
    ext = '.jpg'    

    s3 = boto3.resource(
        's3',
         aws_access_key_id=ACCESS_KEY_ID,
         aws_secret_access_key=ACCESS_SECRET_KEY,
         config=Config(signature_version='s3v4')
    )

    s3.Bucket(BUCKET_NAME).put_object(Key=date+ext, Body=data)

    print ("Done")

1 个答案:

答案 0 :(得分:0)

如果通过重写可以理解,您正在函数内部创建s3对象,那么不工作的原因可能是您正在调用read()多个在同一个文件对象上的次数。

第一个调用返回文件的全部内容,但移动"位置"文件对象的结尾,所以后续调用相同的函数不会返回任何内容 - 因为没有什么可读的。

仅读取一次值,就像seek()回到文件的开头并每次再次读取一样。我建议只读取一次值,以避免不必要的I / O和相关的开销。