#python #google-app-engine #blobstore
#python #google-app-engine #blobstore
Вопрос:
У меня есть серверный код для обработки загруженных двоичных файлов:
class UploadHandler(webapp.RequestHandler):
def post(self):
file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
f.write('data')
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)
Это код из examples, поэтому на самом деле он не обрабатывает никаких загруженных файлов, просто создает новый объект Blobstore и записывает в него некоторые данные. Со стороны клиента у меня есть эта часть кода, которая фактически отправляет файл на сервер:
var xhr = new XMLHttpRequest();
xhr.open("post", "/upload", true);
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.setRequestHeader("X-File-Name", file.fileName);
xhr.setRequestHeader("X-File-Size", file.fileSize);
xhr.setRequestHeader("X-File-Type", file.type);
xhr.send(file);
В FireBug я вижу, что он загружает файл на сервер, и серверный код создает файл таким, каким он должен быть. Я не могу понять, как соединить эти две части, чтобы серверный код мог получать загруженный файл в виде потока. Я не использую формы, поэтому я не могу получить файл с чем-то вроде upload_files = self.get_uploads('file')
. Как мне получить файл на стороне сервера?
ОБНОВЛЕНИЕ: Я нашел ответ в документации GAE об обработчиках запросов webapp. Мне нужно использовать что-то вроде этого uploaded_file = self.request.body
, чтобы получить поток файлов. Затем я просто использую f.write(uploaded_file)
для его сохранения. Кажется, у меня это работает. Пожалуйста, поделитесь своими мыслями, если это хороший подход.
Ответ №1:
Должно быть что-то вроде этого:
class UploadHandler(webapp.RequestHandler):
def post(self):
mime_type = self.request.headers['X-File-Type']
name = self.request.headers['X-File-Name']
file_name = files.blobstore.create(mime_type=mime_type,
_blobinfo_uploaded_filename=name)
with files.open(file_name, 'a') as f:
f.write(self.request.body)
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)
Ваши пользовательские заголовки и тело могут быть извлечены из объекта WEBBOB Request. Обратите внимание, что вам не нужно наследовать от BlobStoreUploadHandler, поскольку вы не используете HTML-форму загрузки.
Комментарии:
1. Это сработает, только если размер файла меньше 10 МБ. В противном случае вам следует отправить правильно закодированную составную форму и использовать обычный метод загрузки blobstore.