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

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

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'). Как получить файл на стороне сервера?

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

1 Ответ

1 голос
/ 03 мая 2011

Должно быть примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...