[PYTHON] Nutzung von Google Cloud Storage (GCS) durch "GAE / Py"

Die Beschreibung basiert auf der Annahme, dass die Datei vom Client in der Anwendung hochgeladen wird, die unter "GAE / Python" ausgeführt wird. Auf der Serverseite erstellte Datendateien (Datensicherung usw.) werden nicht gelesen / geschrieben. Es soll Clients die Möglichkeit geben, Dateien anzuhängen und herunterzuladen.

Die Beschreibung befindet sich auf einer Ebene, die Sie später verstehen können, sodass die detaillierte Erklärung nicht korrekt ist. Es kann auch zu Missverständnissen kommen, daher wäre es hilfreich, wenn Sie in diesem Fall darauf hinweisen könnten.

[Referenz: Siehe folgenden Artikel]

Betriebsübersicht

hochladen

  1. Die beim Hochladen verwendete URL-Erfassungs-API wird getroffen (API zum Erstellen der URL)
  2. Benachrichtigen Sie den Client über die URL in der Antwort "1".
  3. Auf der Clientseite wird eine Anforderung mit einer Datei an die in "2" angegebene URL gesendet.
  4. Nach Abschluss des Uploads wird GAE (*) über die Anforderung (POST) informiert, einschließlich der Informationen zu der von GCS hochgeladenen Datei (Google Cloud Storage: im Folgenden GCS).
  1. Erstellen Sie bei Bedarf ein zusätzliches Informationsmodell zum Speichern der hochgeladenen Dateiinformationen und registrieren Sie diese im DataStore.

herunterladen

  1. Erhalten Sie eine Download-Anfrage vom Client
  2. Übertragen Sie die Datei als Antwort

Was zu implementieren

  1. Holen Sie sich die Upload-URL-API
    Abrufen der POST-Ziel-URL beim Hochladen einer Datei

1. API zum Abrufen der Upload-URL

Um die URL für das Hochladen in Google Cloud Strage auszugeben, verwenden Sie "create_upload_url" wie bei der Behandlung von blobstore. Durch Hinzufügen von "gs_bucket_name =" als Option können Sie den in GCS erstellten Bucket angeben. Es wird möglich sein.

Die folgende Implementierung ist im Endpunktformat (ich gehe davon aus, dass die API für iOS ausgegeben wird). Extrahieren Sie nur die Teile, die GCS verwenden. Die Beschreibung des Endpunkts wird weggelassen.

ep_upload.py


#Einzigartige Klasse für Endpunkte
import GetUploadUrlResponse

from google.appengine.ext import blobstore
・
・
class GetUploadUrl():
	def __init__(self, request):
        self.response = None

	def done(self):
		# create_upload_Ändern Sie den Namen des GCS-Buckets in der URL in "gs"_bucket_Geben Sie in "Name" an
		url = blobstore.create_upload_url('/uploaded',gs_bucket_name = 'bucket_name/path/')
		return self.response = GetUploadUrlResponse(ret = 0,
												   	url = url)
・
・

2. Fordern Sie den Handler nach dem Hochladen an

Wenn die Veröffentlichung der Datei an die ausgegebene URL abgeschlossen und der Upload in GCS abgeschlossen ist, wird die Anforderung einschließlich der Dateiinformationen an die unter "create_upload_url" angegebene Adresse benachrichtigt. Erhalten Sie die Benachrichtigung und registrieren Sie sie im DataStore mit Model usw., das die hochgeladene Datei verwaltet.

Es gibt die folgenden zwei Arten von Erfassungsmethoden, die von blobstore_handlers geerbt wurden.BlobstoreUploadHandler, um die hochgeladene Datei von der Anforderung abzurufen.

Beide sind in Bezug auf die Informationen der hochgeladenen Datei gleich, beachten Sie jedoch, dass die von ihnen behandelten Formate völlig unterschiedlich sind.

Bei Verwendung von get_upload: BlobInfo Bei Verwendung von get_file_infos: FileInfo

In meiner Implementierung (Umgebung?) Kann "get_file_infos" nicht heruntergeladen werden (ein Fehler tritt auf). Ich habe "get_upload" verwendet.

upload.py


import webapp
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
from models import GsFile
・
・
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler,webapp.RequestHandler):
	def post(self):
		blob_infos = self.get_uploads('file')
       
		if not isinstance(blob_infos, list):
			blob_infos = [blob_infos]

		for blob_info in blob_infos:	
			GsFile.create(	filename		= blob_info.filename
							content_type	= blob_info.content_type
							size			= blob_info.size
							key				= str(blob_info.key()))
							
		self.response.write('0')
・
・

3. Handler herunterladen

Der Client bezieht sich auf das Verwaltungsmodell (in diesem Beispiel GsFile), das nach Abschluss des Uploads registriert wurde, und Stellen Sie eine Download-Anfrage mit den wichtigsten Informationen.

upload.py


・
・
class ContentDownload(blobstore_handlers.BlobstoreDownloadHandler):
	def get(self, key):
		key = str(urllib.unquote(key))
		blob_info = blobstore.BlobInfo.get(key)
		self.send_blob(blob_info)
・
・

Wenn Sie beim Herunterladen per Link aus dem Browser den Dateinamen so aufrufen, wie er ist, kann er nicht abgerufen werden, sodass er unter dem Namen des URL-Teils gespeichert wird. Wenn Sie den direkten Download vom Browser implementieren möchten, setzen Sie die Option "send_blob" (save_as).

self.send_blob(blob_info, save_as=True)

4. Verknüpfung mit dem Handler

Legen Sie die Klasse fest, die jeder Anforderung entspricht (Mit Download können Sie den Schlüssel in die URL eingeben).

upload.py


・
・
APPLICATION = webapp.WSGIApplication([('/upload', UploadHandler),
                                      ('/download/([^/]+)?', DownloadHandler)])

app.yaml


- url: /(upload|download/.*)
  script: upload.APPLICATION

Recommended Posts

Nutzung von Google Cloud Storage (GCS) durch "GAE / Py"
Eine Geschichte, die mit ein wenig Einfallsreichtum mit Google Cloud Storage verknüpft ist
Spracherkennung von WAV-Dateien mit der Google Cloud Speech API Beta
Laden Sie Dateien in den Cloud Storage (GCS) von GCP hoch. ~ Laden Sie mit lokalem Python
Kopieren Sie Daten von Amazon S3 mit Python (boto) in Google Cloud Storage.
Streaming-Spracherkennung mit der Google Cloud Speech API
Verwenden Sie Tabpy mit Cloud Run (auf GKE)
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Verwenden Sie die Google Cloud Vision-API von Python
Verwenden Sie TPU und Keras mit Google Colaboratory
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Firebase: Verwenden Sie Cloud Firestore und Cloud Storage von Python
Abrufen der Google Cloud Storage-Objektliste in Java
Verwenden Sie mit pyenv mehrere Versionen der Python-Umgebung
Verwendung der Google Cloud Translation API
Die Geschichte des Versuchs, Tensorboard mit Pytorch zu verwenden
Vorsichtsmaßnahmen bei Verwendung der Google Cloud-Bibliothek mit GAE / py
GUI-Erstellung mit Pyside Teil 2 <Verwendung der Klasse>
[GoogleCloudPlatform] Verwenden Sie die Google Cloud-API mit der API-Clientbibliothek
Verwenden Sie Python / Django mit dem Windows Azure Cloud Service!