2015-09-01 3 views
1

Я просмотрел много вопросов, но, похоже, я не могу найти решение одной конкретной проблемы.HTML, jQuery, Python - Загрузка файла формы (GAE)

Я пытаюсь разрешить пользователям (на моем сайте Google App Engine) загружать видео в wistia (видео хост).

Я был в состоянии получить его на работу, непосредственно открыв файл, но это работает только, если файл уже находится в папке приложения:

class VideoUploadHandler(webapp2.RequestHandler): 
    def post(self): 
     title = self.request.get('title') 
     video = self.request.get('video') 
     description = self.request.get('description') 

     url = 'https://upload.wistia.com' 
     params = { 
      'api_password' : 'my_password', 
      'file'   : open(video, "rb"), #<--- HOW TO USE FILE OBJECT? 
      'project_id'  : 'my_project_id', 
      'name'   : title, 
      'description'  : description, 
      } 
     opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
     response = opener.open(url, params) 

     logging.warning(response.read()) 

     self.redirect("https://www.my_webpage.com/") 

Это работает, если переменная «видео» является лишь имя файла, и файл находится в той же папке, но я, очевидно, необходимо, чтобы позволить пользователям выбрать любой файл, так что я изменил мой HTML на это:

HTML:

<form enctype="multipart/form-data" action="/video_upload/" method="post"> 
<p>Title: <input type="text" name="title"/></p> 
<p><input type="file" name="video"/></p> 
<p>Description:<br><textarea rows="4" cols="50" name="description"></textarea></p> 
<p><input type="submit" value="Upload"/></p> 
</form> 

Однако я HAVI Проблема с пониманием использования файлового объекта в моем POST-запросе. По какой-то причине я не могу получить эту информацию из других уже опубликованных ответов.

Как структурировать свои «параметры» с помощью этого метода формы HTML?



EDIT:

Чтобы уточнить, у меня теперь есть этот простой HTML:

<input id="video_input" type="file" name="video"/> 
<a id="video_button">SUBMIT VIDEO</a> 

и этот JavaScript, основанный на this и this:

$('#video_button').click(function() { 
    var file = new FormData(); 
    file.append('video', $('#video_input').get(0).files[0]); 
    $.ajax({ 
     type: "POST", 
     url: "/video_upload/", 
     data: file, 
     processData: false, 
     contentType: false 
    }); 
}); 

Но я еще ничего не нашли адекватно объясняя, как взять этот файловый объект, который я сейчас имею в Python, и правильно передать его параметрам для Wistia POST. Любые идеи или ссылки?




EDIT: Traceback при использовании:

params = { 
      'api_password' : 'my_password', 
      'file'   : video, 
      'project_id'  : 'my_project_id', 
      'name'   : title, 
      'description'  : description, 
      } 

(video.py) является файл с классом VideoUploadHandler.

WARNING 2015-09-05 07:13:16,970 urlfetch_stub.py:504] Stripped prohibited headers from URLFetch request: ['Content-Length', 'Host'] 
ERROR 2015-09-05 12:13:21,026 webapp2.py:1552] HTTP Error 500: Internal Server Error 

Traceback (most recent call last): 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 1535, in __call__ 

    rv = self.handle_exception(request, response, e) 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 1529, in __call__ 

    rv = self.router.dispatch(request, response) 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher 

    return route.handler_adapter(request, response) 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 1102, in __call__ 

    return handler.dispatch() 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 572, in dispatch 

    return self.handle_exception(e, self.app.debug) 

    File "C:\...\webapp2-2.5.2\webapp2.py", line 570, in dispatch 

    return method(*args, **kwargs) 

    File "C:\...\video.py", line 84, in post 

    response = opener.open(url, params) 

    File "C:\...\urllib2.py", line 410, in open 

    response = meth(req, response) 

    File "C:\...\urllib2.py", line 523, in http_response 

    'http', request, response, code, msg, hdrs) 

    File "C:\...\urllib2.py", line 448, in error 

    return self._call_chain(*args) 

    File "C:\...\urllib2.py", line 382, in _call_chain 

    result = func(*args) 

    File "C:\...\urllib2.py", line 531, in http_error_default 

    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 

HTTPError: HTTP Error 500: Internal Server Error 

INFO  2015-09-05 07:13:21,700 module.py:788] default: "POST /video_upload/ HTTP/1.1" 500 2253 

ответ

2

EDIT: Попробуйте это:

from poster.encode import multipart_encode, MultipartParam 
from google.appengine.api import urlfetch 

class VideoUploadHandler(webapp2.RequestHandler): 
    def post(self): 
     title = self.request.get('title') 
     description = self.request.get('description') 
     payload = { 
      'api_password' : 'my_password', 
      'project_id'  : 'my_project_id', 
      'name'   : title, 
      'description'  : description, 
      } 
     file_data = self.request.POST['video'] 
     payload['file'] = MultipartParam('file', filename=file_data.filename, 
               filetype=file_data.type, 
               fileobj=file_data.file) 
     data,headers= multipart_encode(payload) 
     send_url = "https://upload.wistia.com" 
     resp = urlfetch.fetch(url=send_url, payload="".join(data), method=urlfetch.POST, headers=headers)  
     logging.info(resp) 
     self.redirect("/") 

Вы будете нуждаться в этом lib и это было взято из этого post

+0

Спасибо за комментарий Райан! Я действительно пробовал это уже, но у меня есть ошибка, поэтому я попробовал еще раз с текстовым файлом. Когда я зарегистрировал переменную «видео» (на этот раз текстовый файл), он действительно отображал простой текст. Итак, я снова попробовал видео. Когда я записываю переменную «video» (в скрипте python), когда она на самом деле является видео, я получаю что-то вроде: «%% 5 £ μÇù Feedslant

+0

Странно, что когда я это делаю: «'file': open (_video_name_in_current_folder_,« rb »),« Это работает - мое видео загружается в wistia без проблем. – Feedslant

+0

Похоже, что это связано с тем, как MultipartPostHandler.MultipartPostHandler обрабатывает файлы. с открытым он отправляет дескриптор файла, а «видео» - это необработанный файл. Это объясняет, почему один работает, а другой - нет. Это похоже на ограничение с обработчиком MultipartPostHandler. Я отредактирую приведенное выше код, который я получил, чтобы работать. – Ryan