it-swarm-id.com

Unggah file di Google App Engine

Saya berencana membuat aplikasi web yang memungkinkan pengguna untuk menurunkan versi file proyek studio visual mereka. Namun, sepertinya Google App Engine menerima pengunggahan file dan penyimpanan file rata di Google Server melalui db.TextProperty dan db.BlobProperty.

Saya akan senang siapa pun dapat memberikan contoh kode (baik klien dan sisi server) tentang bagaimana hal ini dapat dilakukan.

77
Graviton

Ini adalah file yang lengkap dan berfungsi. Saya menarik yang asli dari situs Google dan memodifikasinya untuk membuatnya sedikit lebih nyata.

Beberapa hal yang perlu diperhatikan:

  1. Kode ini menggunakan BlobStore API
  2. Tujuan baris ini di kelas ServeHandler adalah untuk "memperbaiki" kunci sehingga menghilangkan semua nama mangling yang mungkin terjadi di browser (saya tidak melihat ada di Chrome)

    blob_key = str(urllib.unquote(blob_key))
    
  3. Klausa "save_as" di akhir ini penting. Ini akan memastikan bahwa nama file tidak hancur ketika dikirim ke browser Anda. Singkirkan itu untuk mengamati apa yang terjadi.

    self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True)
    

Semoga berhasil!

import os
import urllib

from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app

class MainHandler(webapp.RequestHandler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload')
        self.response.out.write('<html><body>')
        self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
        self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit" name="submit" value="Submit"> </form></body></html>""")

        for b in blobstore.BlobInfo.all():
            self.response.out.write('<li><a href="/serve/%s' % str(b.key()) + '">' + str(b.filename) + '</a>')

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        upload_files = self.get_uploads('file')
        blob_info = upload_files[0]
        self.redirect('/')

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, blob_key):
        blob_key = str(urllib.unquote(blob_key))
        if not blobstore.get(blob_key):
            self.error(404)
        else:
            self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True)

def main():
    application = webapp.WSGIApplication(
          [('/', MainHandler),
           ('/upload', UploadHandler),
           ('/serve/([^/]+)?', ServeHandler),
          ], debug=True)
    run_wsgi_app(application)

if __== '__main__':
  main()
42
010110110101

Sebenarnya, pertanyaan ini dijawab dalam dokumentasi App Egnine. Lihat contoh pada Mengunggah Gambar Pengguna .

Kode HTML, di dalam <form> </form>:

<input type = "file" name = "img" />

Kode python:

buku tamu kelas (webapp.RequestHandler): 
 postingan (diri): 
 ucapan = Salam () 
 jika users.get_current_user (): 
 greeting.author = users.get_current_user () 
 greeting.content = self.request.get ("content") 
 avatar = self.request.get ("img") 
 salam.analisa = db.Blob (avatar) 
 greeting.put () 
 self.redirect ('/')
49
sastanin

Ada utas di Grup Google tentang itu:

Mengunggah File

Dengan banyak kode yang bermanfaat, diskusi itu sangat membantu saya dalam mengunggah file.

10

Saya mencobanya hari ini, Ini berfungsi sebagai berikut:

versi SDK saya adalah 1.3.x

halaman html:

<form enctype="multipart/form-data" action="/upload" method="post" > 
<input type="file" name="myfile" /> 
<input type="submit" /> 
</form> 

Kode Server:

file_contents = self.request.POST.get('myfile').file.read() 
6
Bili

Google telah merilis layanan untuk menyimpan file besar. Lihat dokumentasi API blobstore . Jika file Anda> 1MB, Anda harus menggunakannya.

6
jbochi

Jika Anda masih mengalami masalah, periksa Anda menggunakan enctype di tag formulir

Tidak:

<form encoding="multipart/form-data" action="/upload">

Iya:

<form enctype="multipart/form-data" action="/upload">
3
Joe Petrini

Anda tidak dapat menyimpan file karena tidak ada sistem file tradisional. Anda hanya dapat menyimpannya di DataStore mereka sendiri (di bidang yang didefinisikan sebagai BlobProperty )

Ada contoh di tautan sebelumnya:

class MyModel(db.Model):
  blob = db.BlobProperty()

obj = MyModel()
obj.blob = db.Blob( file_contents )
1
Guido

Secara pribadi saya menemukan tutorial yang dijelaskan di sini berguna ketika menggunakan Java waktu berjalan dengan GAE. Untuk beberapa alasan, ketika saya mencoba mengunggah file menggunakan

<form action="/testservelet" method="get" enctype="multipart/form-data">
    <div>
        Myfile:<input type="file" name="file" size="50"/>
    </div>

    <div>
        <input type="submit" value="Upload file">
    </div>
</form>

Saya menemukan bahwa kelas HttpServlet saya karena suatu alasan tidak akan menerima formulir dengan atribut 'enctype'. Menghapusnya berfungsi, namun ini berarti saya tidak dapat mengunggah file apa pun.

1
Vijay Sharma

Ada cara menggunakan sistem file datar (Atleast dalam perspektif penggunaan)

Ada ini proyek Google Sistem Mesin Virtual FileSystem . yang diimplementasikan dengan bantuan datastore dan memcache API untuk meniru sistem file biasa. Dengan menggunakan perpustakaan ini, Anda dapat menggunakan di dalam Anda memproyeksikan suatu akses sistem file yang serupa (baca dan tulis) .

0
vivek_jonam

Tidak ada penyimpanan file datar di Google App Engine. Semuanya harus masuk ke Datastore yang agak seperti database relasional tetapi tidak cukup.

Anda dapat menyimpan file sebagai TextProperty atau BlobProperty atribut.

Ada batasan 1MB pada entri DataStore yang mungkin atau mungkin tidak menjadi masalah.

0
Dave Webb

Saya telah mengamati beberapa perilaku aneh ketika mengunggah file di App Engine. Saat Anda mengirimkan formulir berikut:

<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="img" />
    ...
</form>

Dan kemudian Anda mengekstrak img dari permintaan seperti ini:

img_contents = self.request.get('img')

Variabel img_contents Adalah str() di Google Chrome, tetapi ini merupakan unicode di Firefox. Dan seperti Anda sekarang, konstruktor db.Blob() mengambil string dan akan melempar kesalahan jika Anda memasukkan string unicode.

Adakah yang tahu bagaimana ini bisa diperbaiki?

Juga, apa yang saya temukan benar-benar aneh adalah bahwa ketika saya menyalin dan menempel aplikasi Buku Tamu (dengan avatar), itu berfungsi dengan baik. Saya melakukan semuanya dengan cara yang persis sama dalam kode saya, tetapi itu tidak akan berhasil. Saya hampir mencabut rambut saya.

0
Honza Pokorny