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

相关推荐
LuckySusu6 小时前
【js篇】JavaScript 对象创建的 6 种方式:从基础到高级
前端·javascript
LuckySusu6 小时前
【js篇】async/await 的五大核心优势:让异步代码像同步一样清晰
前端·javascript
艾雅法拉拉6 小时前
JS知识点回顾(1)
前端·javascript·面试
LuckySusu6 小时前
【js篇】Promise 解决了什么问题?—— 彻底告别“回调地狱”
前端·javascript
游荡de蝌蚪6 小时前
快速打造Vue后台管理系统
前端·javascript·vue.js
June_liu8 小时前
列太多vxe-table自动启用横向虚拟滚动引起的bug
前端·javascript
云枫晖8 小时前
手写Promise-then的基础实现
前端·javascript
养生达人_zzzz8 小时前
飞书三方登录功能实现与行业思考
前端·javascript·架构
GarrettGao8 小时前
Frida常见用法
javascript·python·逆向
肥晨9 小时前
前端私有化变量还只会加前缀嘛?保姆级教程教你4种私有化变量方法
前端·javascript