Utilisation de Google Cloud Storage (GCS) par "GAE / Py"

La description suppose le téléchargement du fichier depuis le client dans l'application exécutée sur "GAE / Python". Il ne lit / n'écrit pas les fichiers de données créés côté serveur (sauvegarde de données, etc.). Il est destiné à ajouter la possibilité pour les clients de joindre et de télécharger des fichiers.

La description est à un niveau que vous pouvez comprendre plus tard, donc l'explication détaillée est interrompue. De plus, il peut y avoir des malentendus, il serait donc utile que vous puissiez le signaler dans ce cas.

[Référence: reportez-vous à l'article suivant]

Aperçu du fonctionnement

télécharger

  1. L'API d'acquisition d'URL utilisée lors du téléchargement est frappée (API pour créer l'URL)
  2. Informez le client de l'URL dans la réponse "1".
  3. Du côté client, une requête comprenant un fichier est POSTÉE à l'URL notifiée en "2".
  4. Une fois le téléchargement terminé, GAE (*) sera informé de la demande (POST), y compris les informations du fichier téléchargé depuis GCS (Google Cloud Storage: ci-après GCS).
  1. Si nécessaire, créez un modèle d'informations supplémentaires pour enregistrer les informations du fichier téléchargé et enregistrez-le dans le DataStore.

Télécharger

  1. Recevoir une demande de téléchargement du client
  2. Transférez le fichier en réponse

Que mettre en œuvre

  1. Obtenez l'API d'URL de téléchargement
    Obtenir l'URL de destination POST lors du téléchargement d'un fichier --Request handler après téléchargement
    Acquisition d'informations et enregistrement des fichiers téléchargés

1. API pour obtenir l'URL de téléchargement

Pour émettre l'URL de téléchargement vers Google Cloud Strage, utilisez "create_upload_url" comme dans la gestion de blobstore, mais en ajoutant "gs_bucket_name =" en option, vous pouvez spécifier le bucket créé sur GCS. Ce sera possible.

L'implémentation suivante est au format de point de terminaison (je suppose que l'API pour iOS sera sortie). Extrayez uniquement les pièces qui utilisent GCS. La description du point de terminaison est omise.

ep_upload.py


#Classe unique pour les terminaux
import GetUploadUrlResponse

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

	def done(self):
		# create_upload_Remplacez le nom du bucket GCS par "gs" dans l'URL_bucket_Précisez dans "nom"
		url = blobstore.create_upload_url('/uploaded',gs_bucket_name = 'bucket_name/path/')
		return self.response = GetUploadUrlResponse(ret = 0,
												   	url = url)
・
・

2. Demander le gestionnaire après le téléchargement

Lorsque la publication du fichier sur l'URL émise est terminée et que le téléchargement vers GCS est terminé, la demande comprenant les informations sur le fichier est notifiée à l'adresse spécifiée dans "create_upload_url". Recevez la notification et enregistrez-la dans le DataStore avec Model etc. qui gère le fichier téléchargé.

Il existe les deux types suivants de méthodes d'acquisition héritées de blobstore_handlers.BlobstoreUploadHandler pour l'acquisition de fichiers téléchargés à partir de requêtes.

Les deux sont les mêmes en termes d'informations sur le fichier téléchargé, mais notez que les formats qu'ils gèrent sont complètement différents.

Lors de l'utilisation de get_upload: BlobInfo Lors de l'utilisation de get_file_infos: FileInfo

Dans mon implémentation (environnement?), Si "get_file_infos" est utilisé, il ne sera pas possible de télécharger (une erreur se produira). J'ai utilisé "get_upload".

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. Télécharger le gestionnaire

Le client fait référence au modèle de gestion (GsFile dans cet exemple) enregistré lorsque le téléchargement est terminé, et Faites une demande de téléchargement avec les informations clés.

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)
・
・

Lors du téléchargement par lien depuis le navigateur, si vous l'appelez tel quel, le nom du fichier ne peut pas être obtenu, il sera donc enregistré avec le nom de la partie URL. Si vous souhaitez implémenter le téléchargement direct depuis le navigateur, définissez l'option "send_blob" (save_as).

self.send_blob(blob_info, save_as=True)

4. Lien vers le gestionnaire

Définir la classe correspondant à chaque requête (Télécharger permet de saisir la clé sur l'URL)

upload.py


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

app.yaml


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

Recommended Posts

Utilisation de Google Cloud Storage (GCS) par "GAE / Py"
Une histoire liée à Google Cloud Storage avec un peu d'ingéniosité
Reconnaissance vocale des fichiers wav avec Google Cloud Speech API Beta
Télécharger le fichier sur Cloud Storage (GCS) de GCP ~ Charger avec Python local
Copier des données d'Amazon S3 vers Google Cloud Storage avec Python (boto)
Reconnaissance vocale en streaming avec l'API Google Cloud Speech
Utiliser Tabpy avec Cloud Run (sur GKE)
Essayez d'utiliser Python avec Google Cloud Functions
Utiliser l'API Google Cloud Vision de Python
Utilisez TPU et Keras avec Google Colaboratory
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.
Firebase: utilisez Cloud Firestore et Cloud Storage depuis Python
Obtenir la liste des objets Google Cloud Storage en Java
Utiliser plusieurs versions de l'environnement python avec pyenv
Comment utiliser l'API Google Cloud Translation
Histoire d'essayer d'utiliser Tensorboard avec Pytorch
Précautions lors de l'utilisation de la bibliothèque google-cloud avec GAE / py
Création de l'interface graphique avec Pyside Partie 2 <Utilisation de la classe>
[GoogleCloudPlatform] Utiliser l'API Google Cloud avec la bibliothèque cliente d'API
Utilisez Python / Django avec Windows Azure Cloud Service!