JavaScript+Flask 实现视频上传的简单demo

前言

需求说明

  1. 在网页上选择本地视频并上传到后端服务器
  2. 后端接收到视频后存储到本地,然后进行处理

技术栈:

前端采用原生HTML+JavaScript

后端采用Flask框架

前端代码

操作步骤:

  1. 选中视频文件
  2. 获取文件内容及文件名
  3. 将文件内容和文件名封装到一个FormData对象中
  4. 发起请求,将文件上传到后端服务器

完整代码如下:

有关FormData的使用参考:FormData 对象的使用 - Web API 接口参考 | MDN

html 复制代码
<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>视频上传</title>
  </head>

  <body>
    <input type="file" id="video" accept="video/mp4">
    <button onclick="upload()">上传视频</button>

    <script>
      function upload() {
        let videoUpload = document.getElementById('video')
        let video = videoUpload.files[0]

        let formData = new FormData()
        formData.append('video', file) //文件
        formData.append('name', file.name) //文件名

        let xhr = new XMLHttpRequest()
        xhr.open('POST', 'http://10.241.4.160:5000/upload', true)
        xhr.responseType = 'text' //响应类型
        xhr.onload = function () {
          if (xhr.status === 200) {
            console.log(xhr.response); //响应内容 (上传成功/文件已存在)
          } else {
            console.error('请求失败,状态码:' + xhr.status);
          }
        };
        xhr.send(formData)
      }
    </script>
  </body>
</html>

后端代码

操作步骤:

  1. 接收前端传来的请求参数
  2. 根据文件名判断当前文件是否已经存在
  3. 如果不存在则保存文件,如果存在则不进行任何操作

完整代码如下:

python 复制代码
from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app, supports_credentials=True)  #允许所有来源的跨域请求

# 文件上传
@app.route('/upload',  methods=["POST"])
def upload():
    file = request.files['file'].stream.read() #视频文件
    name = request.form['name'] #文件名(注意是表单格式)
    print(video_exist(name))
    if not video_exist(name):
        # 保存视频文件到本地
        file_path = os.getcwd() + '\\videos\\' + name
        with open(file_path,'ab') as f:
            f.write(file)
        return '上传成功'
    else:
        return '文件已经存在'

# 判断文件是否存在
def video_exist(video_name):
    path = os.getcwd() + '\\videos\\'
    video_path = os.path.join(path,video_name)
    return os.path.isfile(video_path)
    
if __name__ == '__main__':
    app.run()

后续的视频处理可以考虑使用cv2 来进行,例如通过**cv2.VideoCapture(path)**方法来读取指定路径的视频文件

相关推荐
只喜欢赚钱的棉花没有糖1 小时前
http的缓存问题
前端·javascript·http
让梦想疯狂1 小时前
开源、免费、美观的 Vue 后台管理系统模板
前端·javascript·vue.js
葡萄糖o_o2 小时前
ResizeObserver的错误
前端·javascript·html
腾飞开源2 小时前
17_Flask部署到网络服务器
python·flask·python web开发·flask快速入门教程·flask框架·flask视频教程·flask会话技术
sunbyte2 小时前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | AnimatedNavigation(动态导航)
前端·javascript·vue.js·tailwindcss
mikes zhang2 小时前
Flask文件上传与异常处理完全指南
后端·python·flask
光电的一只菜鸡3 小时前
ubuntu之坑(十四)——安装FFmpeg进行本地视频推流(在海思平台上运行)
ubuntu·ffmpeg·音视频
JustHappy3 小时前
啥是Hooks?为啥要用Hooks?Hooks该怎么用?像是Vue中的什么?React Hooks的使用姿势(下)
前端·javascript·react.js
江城开朗的豌豆3 小时前
Vue中Token存储那点事儿:从localStorage到内存的避坑指南
前端·javascript·vue.js
江城开朗的豌豆4 小时前
MVVM框架:让前端开发像搭积木一样简单!
前端·javascript·vue.js