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)**方法来读取指定路径的视频文件

相关推荐
xhxxx30 分钟前
prototype 是遗产,proto 是族谱:一文吃透 JS 原型链
前端·javascript
大模型实验室Lab4AI32 分钟前
从帧到世界:面向世界模型的长视频生成
音视频
蚂蚁集团数据体验技术2 小时前
一个可以补充 Mermaid 的可视化组件库 Infographic
前端·javascript·llm
华仔啊2 小时前
还在用 WebSocket 做实时通信?SSE 可能更简单
前端·javascript
木易士心3 小时前
深入剖析:按下 F5 后,浏览器前端究竟发生了什么?
前端·javascript
Q_Q5110082854 小时前
python+django/flask的结合人脸识别和实名认证的校园论坛系统
spring boot·python·django·flask·node.js·php
Q_Q5110082854 小时前
python+django/flask的选课系统与课程评价整合系统
spring boot·python·django·flask·node.js·php
charlie1145141914 小时前
勇闯前后端Week2:后端基础——Flask API速览
笔记·后端·python·学习·flask·教程
xump4 小时前
如何在DevTools选中调试一个实时交互才能显示的元素样式
前端·javascript·css
Front_Yue4 小时前
深入探究跨域请求及其解决方案
前端·javascript