Я просмотрел много вопросов, но, похоже, я не могу найти решение одной конкретной проблемы.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
Спасибо за комментарий Райан! Я действительно пробовал это уже, но у меня есть ошибка, поэтому я попробовал еще раз с текстовым файлом. Когда я зарегистрировал переменную «видео» (на этот раз текстовый файл), он действительно отображал простой текст. Итак, я снова попробовал видео. Когда я записываю переменную «video» (в скрипте python), когда она на самом деле является видео, я получаю что-то вроде: «%% 5 £ μÇù
FeedslantСтранно, что когда я это делаю: «'file': open (_video_name_in_current_folder_,« rb »),« Это работает - мое видео загружается в wistia без проблем. – Feedslant
Похоже, что это связано с тем, как MultipartPostHandler.MultipartPostHandler обрабатывает файлы. с открытым он отправляет дескриптор файла, а «видео» - это необработанный файл. Это объясняет, почему один работает, а другой - нет. Это похоже на ограничение с обработчиком MultipartPostHandler. Я отредактирую приведенное выше код, который я получил, чтобы работать. – Ryan