У меня есть веб-сборка с Python / FLASK. На моем сайте я хочу разрешить пользователю загружать различные видеоролики, которые я разместил на сервере. Я провел много исследований, но не смог решить мою проблему.
Подход, который я предложил, - это сочетание Jquery и Python. На моем сайте у меня есть 2 разные кнопки HTML (одна кнопка для загрузки каждого из видеоклипов).
На моем интерфейсе я делаю это в Jquery:
$("#downloadMovieOne, #downloadMovieTwo").click(function(){
var selectedMovie = $(this).val();
if (selectedMovie == "MovieOne"){
$.ajax({
type: 'POST',
url: '/downloadVideo',
success: function(data){
alert("ok")
$form = $('#downloadMovie');
$form.submit();
},
error: function(data){
alert("error occoured!");
}
});
}else if (selectedMovie == "MovieTwo"){
$.ajax({
type: 'POST',
url: '/downloadVideoTwo',
success: function(data){
alert("ok")
$form = $('#downloadMovieTwo');
$form.submit();
},
error: function(data){
alert("error occoured!");
}
});
}
});
Каждая из id-ссылок в событии click выше представляет каждую кнопку. И «var selectedMov ie» захватывает атрибут значения элемента, по которому щелкнули. Таким образом, я могу использовать его, чтобы проверить, какая кнопка была нажата и, следовательно, какой видеоролик был запрошен.
Над моим Jquery я подготовил 2 HTML элемента формы, которые будут использоваться для каждой загрузки:
<form action="/downloadVideo" id="downloadMovie"><input type="hidden" name="param3" value="value3"></input></form>
и:
<form action="/downloadVideoTwo" id="downloadMovieTwo"><input type="hidden" name="param3" value="value3"></input></form>
На моей стороне сервера у меня есть 2 маршрута, соответствующих каждому из вызовов ajax и каждому элементу загрузки формы:
@app.route('/downloadVideo', methods=['GET','POST'])
def downloadVideoOne():
print("videoOne")
return send_file("[MY SERVER PATH TO THE FILE]\\testResultOne.mp4", attachment_filename='videoOne.mp4', as_attachment=True)
И:
@app.route('/downloadVideoTwo', methods=['GET','POST'])
def downloadVideoTwo():
print("videoTwo")
return send_file("[MY SERVER PATH TO THE FILE]\\testResultTwo.mp4", attachment_filename='videoTwo.mp4', as_attachment=True)
So the total process is like:
1) Click the relevant button.
2) Jquery executes the ajax call based on the clicked button/chosen video.
3) Flask executes the route defined in the jquery (based on the if/else).
4) The matching form element is used to actually download the file.
Идея «Выше» прекрасно работает для первого видео (элемент «downloadMovieOne»). Это фактически отправляет мувиклип в браузер для загрузки, как и ожидалось. Однако при нажатии «downloadMovieTwo» ничего не происходит. Хотя, когда я проверяю процесс в google Chrome, он на самом деле запускает правильный маршрут в python. И это также, кажется, «скачать» файл (он считает размер файла). Но он не отправляет его в браузер через. элемент формы, как это происходит с элементом movieOne. PS Оба "alert (" ok ")" в скрипте jquery запускаются при нажатии на каждую из кнопок.
Я просто не знаю t understand this ? Should
Разве это не работает полностью с двумя кнопками? Процесс / поток данных должен быть на 100% идентичен (конечно, с каждой из своих ссылок).
Кто-нибудь может сказать, почему этот подход не работает (или почему он работает только для первого файла)?
Заранее спасибо
Обновление 2020-04-21: Исправление проблемы: Я пытался (просто из любопытства) изменить ссылки на атрибуты с id s (#) to class
s ( .) в двух формах, которые будут использоваться для каждой загрузки. И затем также в каждом случае if / else в скрипте Jquery. И теперь, похоже, работает. Таким образом, очевидно, что при таком подходе можно использовать атрибут id, только если у вас есть только один файл для загрузки. Если у вас есть более одного, используйте класс вместо этого. Если кто-то может объяснить, почему это так, пожалуйста, поделитесь.
PS Похоже, это не проблема браузера, так как в случае IE и G- Chrome.