簡體   English   中英

使用python將多個文件發送到aws s3時出錯

[英]error sending multiple files to aws s3 using python

我正在學習使用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")

通過重寫可以理解,如果您正在函數內部創建s3對象,則無法正常工作的原因可能是因為您在同一文件對象上多次調用read()

第一次調用返回文件的全部內容,但是將文件對象的“位置”移到末尾,因此同一函數的后續調用不返回任何內容-因為沒有更多要讀取的內容。

只讀取一次值就可以了,就像seek()返回文件的開頭並每次都重新讀取一樣。 我建議只讀取一次該值,以避免不必要的I / O和相關的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM