Ich bin sicher, die Antwort auf diese Frage ist einfach, aber für mich ist es sehr frustrierend, da ich keine Lösung, die ich gefunden habe, in praktische Code für meine eigene Benutzung.Hochladen von Dateien in Google Cloud-Speicher von Appengine App
Ich baue eine App auf der App-Engine, mit der der Benutzer eine Datei hochladen kann, die dann von der App bearbeitet wird. Die Dateigröße beträgt in der Regel einige MB und in einigen Fällen bis zu 20 MB. Dies ist genug, um die 30-Sekunden-Zeitüberschreitung in der App-Engine auszulösen, und ich versuche daher, direkt in den Cloud-Speicher zu laden, wie auf verschiedenen Websites vorgeschlagen (einschließlich hier).
Der Upload Teil meiner Form sieht wie folgt aus:
<form name="convert" action="/transform" method="post" enctype="multipart/form-data">
<input type="file" name="coords">
<input type="submit" name="submit" value="Transform">
</form>
Und die Prozedur sieht wie folgt aus (ich bin nur mit der App Engine anfangen, so entschuldigen, wenn dieser blöde aussieht
class TransformPage(BaseHandler):
def get(self):
self.render_template('transform.html',name=self.request.get('form'))
def post(self):
filename = self.request.POST['coords'].filename
filesize = int(self.request.headers['Content_Length'])
if filesize>5242880:
self.redirect('/error')
else:
save_to_cloud(file.value,filename)
# Start processing file here
.
ich habe bei der Prüfung für die Dateigröße als eine sehr einfache Art und Weise den 30er Jahren Timeout zu verhindern, und 5Mb scheint die maximale Größe zu sein, die ich in 30s in meinem Netzwerk durchsetzen können.
die save_t o_cloud() ist nur ein Wrapper ich um die Google Cloud-Storage-API geschrieben hat, und sieht wie folgt aus:
def save_to_cloud(f,filename):
filename = BUCKET + filename
create_file_and_write(f,filename)
Die vor allem Werke, und ich sehe die hochgeladenen Dateien in Cloud-Speicher zu landen, aber wie ich oben sagte , bricht für größere Dateien zusammen. Ich habe Hinweise zur Verwendung von create_upload_url gefunden, aber ich bin nicht gut genug, um zu sehen, wie das in meinem Fall aussieht, insbesondere den Inhalt der hochgeladenen Datei in den Speicher einzulesen, damit ich sie in den Cloud-Speicher schreiben kann.
Dies ist wahrscheinlich die einfachste Sache der Welt ist, wenn Sie wissen, wie es geht, aber ich kann es, ohne dass jemand nicht tun mir in Code zeigt, wie es :-(
Dank
getan werden kannedit: @Itamar. das ist in der Tat, was ich zu tun versuche, obwohl das Upload-Formular auch ein paar andere Auswahl enthält vom Anwender vorgenommen werden ich habe jetzt geändert meinen Code zu diesem
class TransformPage(BaseHandler):
def get(self):
upload_url =blobstore.create_upload_url('/upload',gs_bucket_name='/my_bucket/')
self.render_template('transform.html',
{'name':self.request.get('form'),
{'upload_url':upload_url})
Aber ich kann Lass die upload_url nicht in der Vorlage html erscheinen, die ähnlich aussieht e dieses
<form name="convert" action="{{ upload_url }}" method="post" enctype="multipart/form-data">
Sie können create_upload_url_async statt create_upload_url verwenden. Diese asynchrone Version kann eine Rückruffunktion übernehmen. Sie können das Dokument dazu sehen: https://developers.google.com/appengine/docs/python/blobstore/#Python_Making_asynchronous_requests – olituks
Vielen Dank. Wie Sie jedoch aus meinen Code-Schnipsel oben sehen können, verwende ich create_upload_url nicht, da ich nicht verstehe, wie das in meinem Fall funktioniert (auch nach dem Lesen der Dokumente :-(In meinem Formular habe ich action = "/ transform ", die zu meinem Verständnis" die Form füttert ", zusammen mit der hochgeladenen Datei zu meinem def-Beitrag (selbst): Code in der Klasse TransformPage. – user3664865