下载文件而不存储它

Download a file without storing it

我正在使用 PyTube and Flask 构建一个 Youtube 视频下载器。我想做的是,最终用户收到视频文件,但我从不将其存储到服务器中。

目前代码如下所示:

def download_video():
if request.method == "POST":
    url = YouTube(session['link']) # Getting user input
    itag = request.form.get("itag") # Getting user input
    video = url.streams.get_by_itag(itag) 
    file = video.download(path) # Downloading the video into a folder
    return send_file(file, as_attachment=True) 
return redirect(url_for("home"))

代码工作正常,唯一的缺点是它正在存储到服务器中,稍后可能会成为问题。

我已经尝试将它下载到 /dev/null/,这在本地似乎可以工作,但是当部署到 Heroku 时,我得到了一个 Internal Server Error

非常感谢任何意见。谢谢!

download方法用于:

Write the media stream to disk.

一个肮脏的解决方法当然是在调用 download 后删除保存在 output_path 的文件,但您也可以使用 stream_to_buffer 将媒体流写入缓冲区,并且发送那个。

最小且可重现的示例

from pytube import YouTube
from flask import Flask, send_file
from io import BytesIO

app = Flask(__name__)


@app.route("/")
def index():
    buffer = BytesIO()
    url = YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
    video = url.streams.get_by_itag(18)
    video.stream_to_buffer(buffer)
    buffer.seek(0)

    return send_file(
        buffer,
        as_attachment=True,
        attachment_filename="cool-video.mp4",
        mimetype="video/mp4",
    )


if __name__ == "__main__":
    app.run()