Upload File to App Engine's Blobstore with Python and Flask

  • Posted on: 11 January 2015
  • By: oon
Flask, Python Microframework

Kadang kita butuh menangani file upload saat membuat website dengan Google App Engine, misalnya saat kita membuat web dengan Python menggunakan framework Flask.

URL [1] memberikan contoh yang cukup lengkap tentang bagaimana menangani file upload.

Pertama adalah mendapatkan upload_url (dari method blobstore.create_upload_url ) karena yang akan menghandle upload adalah mekanisme dari App Engine Blobstore, baru kemudian hasilnya diinformasikan ke URL aplikasi kita.

@app.route("/upload")
def upload():
    uploadUri = blobstore.create_upload_url('/submit')
    return render_template('upload.html', uploadUri=uploadUri)

Hasil URL-nya digunakan untuk URL action dari form submit, berikut syntax seperti mekanisme template Jinja2

<form action="{{ uploadUri }}" method="POST" enctype="multipart/form-data">

Kita bisa upload filenya bahkan menggunakan command line curl yang mensimulasikan sebuah form submit:

$ curl http://xxx01.appspot.com/upload
http://xxx01.appspot.com/_ah/upload/xxxyyyzzz/
$ curl -XPOST -F "file=@image.jpg" http://xxx01.appspot.com/_ah/upload/xxxyyyzzz/

Kedua kita membuat URL callback yang akan dipanggil setelah proses upload selesai ditangani oleh Blobstore, hal yang paling penting dalam tahapan ini adalah proses penyimpanan blob_key, karena ini adalah satu-satunya informasi penghubung dari file-file yang tersimpan di Blobstore:

@app.route("/submit", methods=['POST'])
def submit():
    if request.method == 'POST':
        f = request.files['file']
        header = f.headers['Content-Type']
        parsed_header = parse_options_header(header)
        blob_key = parsed_header[1]['blob-key']
        return blob_key

Tapi jangan kuatir, di developer console versi lama http://appengine.google.com kita masih bisa melihat Blob Viewer, kalo mau mengecek file-file apa saja yang sudah berhasil tersimpan.

Mekanisme ini bisa juga digunakan untuk menyimpan ke Google Cloud Storage, dengan blob_key tersebut adalah key yang mengacu ke file yang tersimpan di Google Cloud Storage.

Oya, butuh menampilkan image yang diupload langsung dari Blobstore? misalnya <img src="/img/{{ blob_key }}" /> gunakan mekanisme ini:

@app.route("/img/<bkey>")
def img(bkey):
    blob_info = blobstore.get(bkey)
    response = make_response(blob_info.open().read())
    response.headers['Content-Type'] = blob_info.content_type
    return response

Blobstore, seperti halnya Datastore, ada dua macam driver (dengan package google.appengine.ext.blobstore atau package google.appengine.ext.ndb.blobstore), jadi sesuaikan saat melakukan akses misalnya yang related untuk transaksi ndb gunakan package ext.ndb yang dibuat oleh Guido (creator dari Python) [2].

[1]http://stackoverflow.com/questions/18061264/serve-image-from-gae-datasto...
[2]https://code.google.com/p/googleappengine/issues/detail?id=8487
[3]https://cloud.google.com/appengine/docs/python/blobstore/
[4]https://gist.github.com/merqurio/c0b62eb1e1769317907f

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
By submitting this form, you accept the Mollom privacy policy.