Загрузка файлов с FLASK - PullRequest
       14

Загрузка файлов с FLASK

0 голосов
/ 20 апреля 2020

У меня есть веб-сборка с 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.

...