Как использовать goog.net.IframeIo для загрузки файла в Blobstore в Python?

Здесь я пытаюсь загрузить файл асинхронно в хранилище BLOB-объектов. Вот что я сделал до сих пор:

html-файл

<form id="my_form" enctype="multipart/form-data" method="POST"
      action="/partner">
  <input type="file" id="my_file" name="my_file"/>
</form>

JS-файл

my.Project.prototype.onFileUpload = function(e) {
  var uploadForm = /** @type {HTMLFormElement} */ (
          goog.dom.getElement('my_form'));
  var iframeIo = new goog.net.IframeIo();
  goog.events.listen(iframeIo, goog.net.EventType.COMPLETE, function() { alert('request complete'); });
  iframeIo.sendFromForm(uploadForm);

код Python

class MyHandler(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    logging.info(self.request)   // I can see my file in this line's output
    upload_files = self.get_uploads('my_file')
    logging.info(upload_files)  //upload_files come out to be an empty array
    blob_info = upload_files[0]
    self.redirect('/partner/serve/%s' % blob_info.key())

Любые указатели на то, как получить файл для загрузки из объекта запроса. Код Python, предоставленный учебником Google по blobstore, можно найти здесь .

Теперь я застрял. Я считаю, что если я смогу получить файл в коде Python, я смогу его загрузить. Любые указатели будут очень полезны.

Спасибо,
Мохит


person EMM    schedule 29.05.2012    source источник


Ответы (1)


На самом деле это не вопрос об iframeio, а просто о загрузке в AppEngine. Чего вам не хватает, так это того, что вы должны сначала создать URL-адрес для загрузки в методе GET и использовать его в качестве параметра action для формы. См. пример приложения в документации AppEngine.

Итак, в вашем случае вы бы сделали upload_url = blobstore.create_upload_url('/partner'), а в своем шаблоне <form action="{{ upload_url }}" method="POST" enctype="multipart/form-data"> и т. д.

person Daniel Roseman    schedule 29.05.2012
comment
Спасибо Даниил за ответ. В примере приложения они создают URL-адрес, потому что сначала они хотят, чтобы пользователь попал в MainHandler, где создается форма для облегчения загрузки файла. Если вы видите форму, они предоставили созданный URL-адрес в действии. В моем случае мне не нужен MainHandler. Итак, у меня было action=URL в самой HTML-форме. Кроме того, я могу успешно попасть в нужный обработчик. Единственная проблема заключается в том, чтобы получить файл из объекта запроса. Я надеюсь, что это проясняет мою проблему немного больше. - person EMM; 29.05.2012
comment
Я не понимаю вашего комментария. Вам необходимо выполнить POST на URL-адрес, возвращенный create_url, иначе загрузка не будет работать. AppEngine выполнит загрузку, а затем отправит ваш собственный метод. - person Daniel Roseman; 29.05.2012