Колба send_file не отправляет файл - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Flask с send_file(), чтобы люди скачивали файл с сервера.

Мой текущий код выглядит следующим образом:

@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "POST":
        link = request.form.get('Link')
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            info_dict = ydl.extract_info(link, download=False)
            video_url = info_dict.get("url", None)
            video_id = info_dict.get("id", None)
            video_title = info_dict.get('title', None)
            ydl.download([link])
        print("sending file...")
        send_file("dl/"+video_title+".f137.mp4", as_attachment=True)
        print("file sent, deleting...")
        os.remove("dl/"+video_title+".f137.mp4")
        print("done.")
        return render_template("index.html", message="Success!")
    else:
        return render_template("index.html", message=message)

Единственная причина, по которой я добавил .f137.mp4, заключается в том, что я использую AWS C9 в качестве моей онлайновой IDE и не могу установить FFMPEGобъединить аудио и видео на Amazon Linux.Однако это не проблема.Проблема в том, что он не отправляет запрос на загрузку.

Вот вывод консоли:

127.0.0.1 - - [12/Dec/2018 16:17:41] "POST / HTTP/1.1" 200 -
[youtube] 2AYgi2wsdkE: Downloading webpage
[youtube] 2AYgi2wsdkE: Downloading video info webpage
[youtube] 2AYgi2wsdkE: Downloading webpage
[youtube] 2AYgi2wsdkE: Downloading video info webpage
WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats won't be merged.
[download] Destination: dl/Meme Awards v244.f137.mp4
[download] 100% of 73.82MiB in 00:02
[download] Destination: dl/Meme Awards v244.f140.m4a
[download] 100% of 11.63MiB in 00:00
sending file...
file sent, deleting...
done.
127.0.0.1 - - [12/Dec/2018 16:18:03] "POST / HTTP/1.1" 200 -

Любая и вся помощь приветствуется.Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Как сказал Роб Бричено,

Вам необходимо вернуть результат send_file

Таким образом, вы можете сохранить результат "flask.send_file", а затем очистить, затем верните результат.

print("sending file...")
result = send_file("dl/"+video_title+".f137.mp4", as_attachment=True)
print("file sent, deleting...")
os.remove("dl/"+video_title+".f137.mp4")
return result
0 голосов
/ 12 декабря 2018

Вам нужно return результат send_file:

@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "POST":
        link = request.form.get('Link')
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            info_dict = ydl.extract_info(link, download=False)
            video_url = info_dict.get("url", None)
            video_id = info_dict.get("id", None)
            video_title = info_dict.get('title', None)
            ydl.download([link])
        print("sending file...")
        return send_file("dl/"+video_title+".f137.mp4", as_attachment=True)
    else:
        return render_template("index.html", message=message)

К сожалению, вам будет труднее "очистить" после отправки файла, так что вы, вероятно, захотите сделатьэто как часть планового обслуживания (например, запустить задание cron для удаления старых загруженных файлов).См. здесь для получения дополнительной информации о проблеме.

...