#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()