You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask中通过完整路径播放AVI视频的实现问题求助

Flask 播放非static文件夹下AVI视频的解决方案

问题核心与修复方向

你的思路完全可行——不需要把视频放到static目录,通过Flask接口转发非静态目录的视频文件是标准方案。代码无报错但无法播放,大概率是以下细节没处理到位:

1. 修复send_from_directory的安全性与参数问题

Flask的send_from_directory有路径安全限制,且自动识别MIME类型可能出错,修改接口如下:

import os
from flask import abort

@app.route('/play_video/<filename>')
def play_video(filename):
    folder_path = session.get("folder")
    # 校验目录合法性
    if not folder_path or not os.path.isdir(folder_path):
        abort(400, description="无效的视频目录路径")
    
    # 防止路径遍历攻击,只取文件名部分
    safe_filename = os.path.basename(filename)
    video_full_path = os.path.join(folder_path, safe_filename)
    if not os.path.exists(video_full_path):
        abort(404, description="视频文件不存在")
    
    # 显式指定AVI的MIME类型,避免自动识别错误
    return send_from_directory(folder_path, safe_filename, 
                               as_attachment=False, 
                               mimetype='video/x-msvideo')

2. 修正模板渲染的语法错误

你的render_template调用缺少逗号,正确写法:

return render_template('web.html', avi_file=avi_file)

3. 排查浏览器对AVI的支持问题

现代浏览器对AVI格式支持有限(AVI是容器,内部编码可能不兼容):

  • 打开浏览器控制台的Network标签,查看视频请求的状态码(200为正常,404/403需排查路径权限)
  • 尝试将视频转成MP4(H.264编码)测试,若MP4能播放,说明是AVI编码的兼容性问题
  • 必须用AVI的话,可在video标签添加多个source选项,或提示用户下载视频

4. 确认Session参数有效性

  • 确保用户访问/play_video时,session["folder"]未过期且路径正确
  • 在play_video函数中打印folder_path和safe_filename,确认参数传递无误
  • 若Session不可靠,可将目录路径作为URL参数(需做白名单校验,防止路径遍历攻击)

5. 直接写本地路径的误区

之前尝试在HTML的src写file:///xxx本地路径是无效的——浏览器同源策略会阻止加载本地文件系统资源,必须通过Flask服务器转发。

测试验证步骤

  1. 启动Flask后,直接访问http://localhost:5000/play_video/你的视频文件名.avi,看能否正常播放或下载
  2. 若直接访问正常,检查模板中url_for生成的链接是否正确,确认avi_file变量是带后缀的完整文件名
  3. 若直接访问返回404,检查folder_path与filename拼接后的绝对路径是否存在

内容的提问来源于stack exchange,提问作者MartinCB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:39