使用cherrypy流式传输文件

Posted

技术标签:

【中文标题】使用cherrypy流式传输文件【英文标题】:Streaming files with cherrypy 【发布时间】:2013-05-04 11:15:56 【问题描述】:

我正在尝试使用cherrypy 流式传输视频文件。当我转到 localhost:8080/stream?video=video.avi 时,它开始下载,但几秒钟后,无论文件有多大,它都会“完成”下载。我对此很陌生,无法找出它为什么这样做。另外,如果是 Matroska (.mkv) 为什么它甚至无法识别文件?

这是我的 Stream 类:

class Stream(object):

    @cherrypy.expose
    def default(self, video=None):
        BASE_PATH = ".."
        video = os.path.join(BASE_PATH, video)
        if video == None:
            return "no file specified!"
        if not os.path.exists(video):
            return "file not found!"
        f = open(video)
        size = os.path.getsize(video)
        mime = mimetypes.guess_type(video)[0]
        print(mime)
        cherrypy.response.headers["Content-Type"] = mime
        cherrypy.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(video)
        cherrypy.response.headers["Content-Length"] = size

        BUF_SIZE = 1024 * 5

        def stream():
            data = f.read(BUF_SIZE)
            while len(data) > 0:
                yield data
                data = f.read(BUF_SIZE)

        return stream()
    default._cp_config = 'response.stream': True

【问题讨论】:

【参考方案1】:

我意识到我需要做的就是将 open(video) 更改为 open(video, 'rb') 以便它以二进制模式读取文件。之后,文件完全下载并运行。

【讨论】:

做类似的事情。缓冲时也会停止,并且一旦满足缓冲区大小,也不确定如何继续下载源代码。

以上是关于使用cherrypy流式传输文件的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 流式传输和下载音频文件

C# gRPC 文件流式传输,原始文件小于流式传输的文件

在 Django 中流式传输 CSV 文件

Android 流式音频/视频无法流式传输 rtsp 文件?

在 Node 中使用“fs”,我将如何流式传输 CSV 文件?

流式传输音频文件并缓存它