Как управлять файлами в хранилище данных Google App Engine

#google-app-engine #file #google-cloud-datastore #uploading

#google-app-engine #файл #google-облако-хранилище данных #загрузка

Вопрос:

Моя проблема связана с тем, что пользователь загружает текстовый файл в мое приложение. Мне нужно получить этот файл и обработать его с помощью моего приложения, прежде чем сохранять его в хранилище данных. Из того немногого, что я прочитал, я понимаю, что загружаемые пользователями файлы отправляются непосредственно в хранилище данных в виде больших двоичных объектов, и это нормально, если бы я мог затем получить этот файл, выполнить над ним операции (что означает изменение данных внутри), а затем перезаписать его обратно в хранилище данных. Все эти операции должны выполняться приложением. К сожалению, из документации хранилища данных http://code.google.com/appengine/docs/python/blobstore/overview.html приложение не может напрямую создать большой двоичный объект в хранилище данных. Это моя главная головная боль. Мне просто нужен способ создания нового большого двоичного объекта / файла в хранилище данных из моего приложения без какого-либо взаимодействия с пользователем при загрузке.

Комментарии:

1. Смотрите code.google.com/appengine/docs/python/blobstore / … ; теперь вы можете программно выполнять запись в blobstore, используя files API. (примечание: это на той же странице, где говорится, что вы не можете создавать большие двоичные объекты программно; вот и все для поддержания документов в актуальном состоянии :))

Ответ №1:

blobstore != datastore .

Вы можете читать и записывать данные в хранилище данных столько, сколько захотите, при условии, что объем ваших данных составляет менее1 МБ, используя db.BlobProperty для вашего объекта.

Как отмечает Wooble, новый File API позволяет вам выполнять запись в blobstore, но если вы не выполняете постепенную запись в blobstore-файл с помощью задач или чего-то вроде библиотеки mapreduce, вы по-прежнему ограничены лимитом вызова API в 1 МБ для чтения / записи.

Комментарии:

1. Кроме того, загружаемые пользователями файлы попадают непосредственно в blobstore только в том случае, если вы явно используете blobstore для загрузки — в противном случае они отправляются в ваше приложение, как и в любой другой форме.

Ответ №2:

Спасибо за вашу помощь. После многих бессонных ночей, 3 книг по App Engine и БОЛЬШОГО количества поисковых запросов в Google я нашел ответ. Вот код (он должен быть достаточно понятным):

 from __future__ import with_statement
from google.appengine.api import files
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write('Hello WOrld')
        form=''' <form action="/" method="POST" enctype="multipart/form-data">
Upload File:<input type="file" name="file"><br/>
<input type="submit"></form>'''
        self.response.out.write(form)
        blob_key="w0MC_7MnZ6DyZFvGjgdgrg=="
        blob_info=blobstore.BlobInfo.get(blob_key)
        start=0
        end=blobstore.MAX_BLOB_FETCH_SIZE-1
        read_content=blobstore.fetch_data(blob_key, start, end)
        self.response.out.write(read_content)
    def post(self):
        self.response.out.write('Posting...')
        content=self.request.get('file')
        #self.response.out.write(content)
        #print content
        file_name=files.blobstore.create(mime_type='application/octet-stream')
        with files.open(file_name, 'a') as f:
            f.write(content)
        files.finalize(file_name)
        blob_key=files.blobstore.get_blob_key(file_name)
        print "Blob Key="
        print blob_key

def main():
    application=webapp.WSGIApplication([('/', MainHandler)],debug=True)
    util.run_wsgi_app(application)

if __name__=='__main__':
    main()