Python App Engine che serve file con Google Cloud Storage
-
21-12-2019 - |
Domanda
Attualmente uso il seguente codice per consentire ai miei utenti di caricare file;
uploadurl = blobstore.create_upload_url('/process?session=' + session, gs_bucket_name='mybucketname')
.
E posso servire immagini come questa;
imgurl = get_serving_url(blob_key, size=1600, crop=False, secure_url=True)
.
DOPO IL CONTENUTO viene caricato utilizzando il metodo nel primo codice tagliato, il tasto BLOB contiene encoded_gs_file:
ed è così che sa di servirlo da Google Cloud Service e non del Blobstore come standard.
Tuttavia, non sono sicuro di come servirei qualsiasi altro tipo di file (ad esempio .pdf o .rtf).I non Volete che il contenuto venga visualizzato nel browser, ma piuttosto inviato al client come download (in modo da ottenere la finestra di dialogo Salva file e scegli una posizione sul loroComputer per salvarlo).
Come dovrei andare a fare questo?Grazie.
Soluzione
Utilizzo di Google Serving_url funziona solo per le immagini.
Per servire un PDF dal Blobstore è possibile utilizzare:
class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
(blob_key, extension) = resource.rpartition('.')[::2]
blob_info = blobstore.BlobInfo.get(blob_key)
if not blob_info:
logging.error('Blob NOT FOUND %s' % resource)
self.abort(404)
self.response.headers[b'Content-Type'] = mimetypes.guess_type(blob_info.filename)
self.send_blob(blob_key, save_as=blob_info.filename)
.
Il percorso WebApp2 per questo gestore sembra:
webapp2.Route(r'/dynserve/<resource:(.*)>', handler=DynServe)
.
Per servire:
<a href="/dynserve/<blob_key>.pdf">PDF download</a>
. Altri suggerimenti
Ho intenzione di rispondere alla mia domanda basata sulla risposta da @voscausa
Questo è ciò che sembra il mio gestore (all'interno di un file denominato view.py
);
class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
blob_key = resource
if not blobstore.get(blob_key):
logging.warning('Blob NOT FOUND %s' % resource)
self.abort(404)
return
else:
blob_info = blobstore.BlobInfo.get(blob_key)
self.send_blob(blob_key, save_as=blob_info.filename)
.
abbiamo bisogno di questo in app.yaml
;
- url: /download/.*
script: view.app
secure: always
.
secure: always
è facoltativo, ma lo uso sempre durante la manipolazione dei dati dell'utente.
mettilo in fondo al view.py
;
app = webapp.WSGIApplication([('/download/([^/]+)?', DynServe),
], debug=False)
.
Ora Visita / Download / Blob_Key_Here.(Puoi controllare il DataStore per il tuo tasto BLOB)
Questo è un esempio completamente funzionante che funziona sia con il negozio Blob standard che con il servizio cloud di Google.
Nota: tutte le chiavi BLOB che fanno parte del GCS inizieranno con encoded_gs_file:
e quelle che non sono nel Blobstore standard;L'app Motore utilizza automaticamente questo per determinare dove individuare il file