Как получить загруженный файл для его сохранения с помощью API Blobstore

1

У меня есть код на стороне сервера для обработки загруженных двоичных файлов:

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)

Это код из примеров, поэтому на самом деле он не обрабатывает никаких загруженных файлов, просто создайте новый объект 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'). Как получить файл на стороне сервера?

UPDATE: Я нашел ответ в документации GAE о обработчиках запросов webapp. Мне нужно использовать что-то вроде этого uploaded_file = self.request.body, чтобы получить поток файлов. Затем я просто использую f.write(uploaded_file), чтобы сохранить его. Кажется, это работает для меня. Пожалуйста, поделитесь своими мыслями, если это хороший подход.

Теги:
google-app-engine
blobstore

1 ответ

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)

Пользовательские заголовки и тело можно вытащить из объекта WebOb Request. Обратите внимание, что вам не нужно наследовать от BlobStoreUploadHandler, так как вы не используете форму отправки HTML.

  • 0
    Совершенно верно! Благодарю.
  • 2
    Это будет работать, только если файл меньше 10 МБ. В противном случае вам следует отправить правильно закодированную многокомпонентную форму и использовать обычный метод загрузки в blobstore.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню