下载文件而不存储它
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()
我正在使用 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()