Приложение App Engine не может:
- записать в файловую систему.Приложения должны использовать хранилище данных App Engine для хранения постоянных данных.
Что вам нужно сделать, это представить форму с полем загрузки файла пользователю.
Когда форма отправленафайл загружен, и Blobstore создает большой двоичный объект из содержимого файла и возвращает ключ большого двоичного объекта, полезный для последующего извлечения и обслуживания большого двоичного объекта.
Максимальный допустимый размер объекта составляет 2 гигабайта.
Вот рабочий фрагмент, который вы можете попробовать следующим образом:
#!/usr/bin/env python
#
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>""")
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
self.redirect('/serve/%s' % blob_info.key())
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
resource = str(urllib.unquote(resource))
blob_info = blobstore.BlobInfo.get(resource)
self.send_blob(blob_info)
def main():
application = webapp.WSGIApplication(
[('/', MainHandler),
('/upload', UploadHandler),
('/serve/([^/]+)?', ServeHandler),
], debug=True)
run_wsgi_app(application)
if __name__ == '__main__':
main()
EDIT1:
в вашем конкретном случае вы можете использовать BlobProperty (ограничено 1 МБ) для хранения вашего запроса:
class Photo(db.Model):
imageblob = db.BlobProperty()
, затем адаптируйте webapp.RequestHandler
для сохранения вашего запроса:
class Upload(webapp.RequestHandler):
def post(self):
image = self.request.get("Filedata")
photo = Photo()
photo.imageblob = db.Blob(image)
photo.put()
EDIT2:
Вам не нужно менять свой app.yaml, просто добавьте новый обработчик и отобразите его в своем WSGI.Чтобы получить сохраненную фотографию, вы должны добавить еще один обработчик для обслуживания ваших фотографий:
class DownloadImage(webapp.RequestHandler):
def get(self):
photo= db.get(self.request.get("photo_id"))
if photo:
self.response.headers['Content-Type'] = "image/jpeg"
self.response.out.write(photo.imageblob)
else:
self.response.out.write("Image not available")
, а затем сопоставить новый класс DownloadImage:
application = webapp.WSGIApplication([
...
('/i', DownloadImage),
...
], debug=True)
Вы сможете получать изображения с помощью URL-адреса.например:
yourapp/i?photo_id = photo_key
В соответствии с просьбой, если по какой-то странной причине вы действительно хотите показывать свои изображения, используя этот тип URL www.mysite.com/i/photo_key.jpg
, вы можете попробовать это:
class Download(webapp.RequestHandler):
def get(self, photo_id):
photo= db.get(db.Key(photo_id))
if photo:
self.response.headers['Content-Type'] = "image/jpeg"
self.response.out.write(photo.imageblob)
else:
self.response.out.write("Image not available")
с немного другим отображением:
application = webapp.WSGIApplication([
...
('/i/(\d+)\.jpg', DownloadImage),
...
], debug=True)