Как манипулировать файлами в хранилище данных Google App Engine - PullRequest
4 голосов
/ 03 июня 2011

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

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Спасибо за вашу помощь.После многих бессонных ночей, 3-х книг App Engine и МНОГО Googling, я нашел ответ.Вот код (он должен быть понятен):

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()
2 голосов
/ 03 июня 2011

blobstore != datastore.

Вы можете читать и записывать данные в хранилище данных столько, сколько хотите, если ваши данные <1 МБ, используя <a href="http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#BlobProperty" rel="nofollow">db.BlobProperty для вашей сущности.

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

...