Hochladen und Herunterladen von Bildern in Azure Storage. Mit Python + Anfragen + REST API

Wir haben zusammengefasst, wie Bilder mit der REST-API von Azure Storage mit Python + -Anforderungen gespeichert und abgerufen werden. Normalerweise ist es besser, das folgende SDK für Python zu verwenden, als es mit der REST-API zu implementieren. https://docs.microsoft.com/ja-jp/azure/python-how-to-install

Entwicklungsumgebung

Windows 10 Home Python 3.5.2

Azure Storage https://azure.microsoft.com/ja-jp/services/storage/ Speicher mit API, wie Amazon S3. Holen Sie sich ein Konto im Voraus.

Klasse

Upload → Bild hochladen herunterladen → Bild herunterladen ist. Ich denke, es kann für andere Daten als Bilder verwendet werden, aber ich habe nicht experimentiert.

azure_storage_sample.py


import base64
import sys
import datetime
import hmac
import hashlib
import requests

class AzureStorage:
    storage_account = ""
    storage_container = ""
    access_key = ""
    api_ver = "2014-02-14"
    response = None
    
    def __init__(self, storage_account, storage_container, access_key):
        self.storage_account = storage_account
        self.storage_container = storage_container
        self.access_key = access_key
        pass

    def upload(self, filename, body, type, metadata = {}):
        date = self.get_date()
        size = str(len(body))
        string_to_sign = [
            'PUT',
            '',
            type,
            date,
        ]
        
        #meta data
        ar_metadata = []
        for k, v in metadata.items():
            ar_metadata.append(k+":"+v)

        #Erstellung von Authentifizierungszeichenfolgen
        authorization = self.get_authorization(filename, string_to_sign, ar_metadata)

        #http-Header-Erstellung
        http_headers = {
            'x-ms-blob-type': 'BlockBlob',
            'x-ms-version': self.api_ver,
            'Authorization': authorization,
            'Date': date,
            'Content-Type': type,
            'Content-Length': size,
        }
        
        #Metadaten kombinieren
        for k, v in metadata.items():
            http_headers[k] = v
        
        #http Kommunikation
        url = "https://%s.blob.core.windows.net/%s/%s" % (self.storage_account, self.storage_container, filename)
        try:
            self.response = requests.put(url, data=body, headers=http_headers)
            if (self.response.status_code == 201):
                #ok
                return True
            else:
                #ng
                return False
        except requests.exceptions.RequestException as e:
            return False

    def download(self, filename):
        date = self.get_date()
        string_to_sign = [
            'GET',
            '',
            '',
            date,
        ]

        #Erstellung von Authentifizierungszeichenfolgen
        authorization = self.get_authorization(filename, string_to_sign)

        #http-Header-Erstellung
        http_headers = {
            'x-ms-blob-type': 'BlockBlob',
            'x-ms-version': self.api_ver,
            'Authorization': authorization,
            'Date': date,
        }
        
        #http Kommunikation
        url = "https://%s.blob.core.windows.net/%s/%s" % (self.storage_account, self.storage_container, filename)
        try:
            self.response = requests.get(url, headers=http_headers)
            if (self.response.status_code == 200):
                #ok
                return True
            else:
                #ng
                return False
        except requests.exceptions.RequestException as e:
            return False

    def get_authorization(self, filename, string_to_sign, ar_metadata = None):
        sign_str = "/%s/%s/%s" % (self.storage_account, self.storage_container, filename)
        string_to_sign.extend(['x-ms-blob-type:BlockBlob'])
        if (ar_metadata != None):
            string_to_sign.extend(ar_metadata)
        string_to_sign.extend(['x-ms-version:'+self.api_ver])
        string_to_sign.extend([sign_str])
        string_to_sign = "\n".join(string_to_sign)
        signature = self.make_hash(self.access_key, string_to_sign)
        authorization = "SharedKeyLite %s:%s" % (self.storage_account, signature)
        return authorization

    def get_date(self):
        now = datetime.datetime.now()
        #rfc2822_format = "%a, %d %b %Y %H:%M:%S %z" # ex: Thu, 02 Aug 2001 10:45:23 GMT
        rfc2822_format = "%a, %d %b %Y %H:%M:%S" #Letzte%Weil z unruhig ist
        date = now.strftime(rfc2822_format)
        date = date + " GMT"
        return date

    def get_last_response(self):
        return self.response

    def encode_base64(self, data):
        encoded = base64.b64encode(data)
        return encoded.decode('utf-8')

    def decode_base64(self, data):
        return base64.b64decode(data)

    def make_hash(self, key, str):
        key = self.decode_base64(key)
        str = str.encode('utf-8')
        str_hashed = hmac.HMAC(key, str, hashlib.sha256).digest()
        str_enc = self.encode_base64(str_hashed)
        return str_enc

Verwendung (Upload)

#Authentifizierungsinformationen
storage_account = "xxxxxx"
storage_container = "xxxxxx"
access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

#hochladen
data_filename = "sample.jpg "
data_body = open("sample.jpg ", "rb").read()
data_type = "image/jpeg"
metadata = {
    #'x-ms-meta-m1': 'aaaaaaaa',
    #'x-ms-meta-m2': 'bbbbbbbb',
}
AzureStorage = AzureStorage(storage_account, storage_container, access_key)
result = AzureStorage.upload(data_filename, data_body, data_type, metadata)
if (result == True):
    print("upload ok\n")
else:
    print("upload ng\n")
    response = AzureStorage.get_last_response()
    print(response.text)

Verwendung (Download)

#Authentifizierungsinformationen
storage_account = "xxxxxx"
storage_container = "xxxxxx"
access_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

#herunterladen
data_filename = "sample.jpg "
AzureStorage = AzureStorage(storage_account, storage_container, access_key)
result = AzureStorage.download(data_filename)
if (result == True):
    print("download ok\n")
    response = AzureStorage.get_last_response()
    
    #Heruntergeladene Datei speichern
    with open("download.jpg ", "wb") as f:
        data = bytearray(response.content)
        f.write(data)
else:
    print("download ng\n")

Sie können beim Hochladen beliebige Metadaten hinzufügen. Wenn ich experimentierte, schlug das Hochladen mit Metadaten manchmal aus irgendeinem Grund fehl.

Referenz

Ich bezog mich auf Folgendes. http://qiita.com/ngyuki/items/eb9b890801e49171a0c6 https://docs.microsoft.com/ja-jp/rest/api/storageservices/put-blob

Recommended Posts

Hochladen und Herunterladen von Bildern in Azure Storage. Mit Python + Anfragen + REST API
Datei-Upload in Azure Storage (Python)
Holen Sie sich mit Python + Requests Benutzer, die zu Ihrer Organisation gehören, über die Garoon REST-API
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Hochladen von Dateien in den Cloud-Speicher mit dem Python-SDK von Firebase
Führen Sie Jupyter mit der REST-API aus, um Python-Code zu extrahieren und zu speichern
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Laden Sie Dateien in den Cloud Storage (GCS) von GCP hoch. ~ Laden Sie mit lokalem Python
HTML-Mail mit Bild zum Senden mit Python
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Laden Sie Bilder mit Python auf Google Drive hoch
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Laden Sie WAV-Dateien per FTP mit Python auf X-Server hoch und laden Sie sie herunter
Hochladen mit Heroku, Flask, Python, Git (4)
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
So beschneiden Sie ein Bild mit Python + OpenCV
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
[WP REST API v2] Laden Sie Bilder mit Python hoch
[Azure-Funktionen / Python] Kettenfunktionen mit Warteschlangenspeicherbindung
[Python] Erwähnen Sie mit der Slack-API mehrere Personen
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Laden Sie das durch Anfragen heruntergeladene Bild direkt in S3 hoch
So kratzen Sie Bilddaten von Flickr mit Python
Hochladen mit Heroku, Flask, Python, Git (Teil 3)
[Python] So legen Sie den Download-Speicherort mit youtube-dl fest
Konvertieren Sie das Bild in .zip mit Python in PDF
Hochladen mit Heroku, Flask, Python, Git (Teil 1)
Bildverarbeitung mit Python
Hochladen mit Heroku, Flask, Python, Git (Teil 2)
Speichereingabe- / Ausgabememo von Python in Azure-Funktionen
Wiederholen Sie den Vorgang mit Python-Anforderungen
Hochladen auf ein freigegebenes Laufwerk mit Google Drive API V3
So bedienen Sie die Discord API mit Python (Bot-Registrierung)
Textextraktion (Lese-API) mit Azure Computer Vision-API (Python3.6)
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
[Ev3dev] So zeigen Sie ein BMP-Bild mit Python auf dem LCD an
Festlegen der Cache-Steuerung für den BLOB-Speicher in Azure Storage in Python
Bildanalyse mit Objekterkennungs-API zum Ausprobieren in 1 Stunde
Umgang mit UnicodeDecodeError beim Ausführen des Downloads von Google-Bildern
Bildverarbeitung mit Python (Teil 2)
Stellen Sie mit Python eine Verbindung zu BigQuery her
Verwenden Sie die Trello-API mit Python
Verwenden Sie die Twitter-API mit Python
Bildbearbeitung mit Python OpenCV
Post to Slack mit Python 3
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Bildverarbeitung mit Python (Teil 1)
Web-API mit Python + Falcon
Tweet mit Bild in Python
Bilddateien mit Python sortieren
Bildverarbeitung mit Python (3)
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Rufen Sie die API mit python3 auf.
Verwenden Sie die Unterschall-API mit Python3