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

如何使用JavaScript捕获多图并动态生成canvas存入Django数据库

实现方案

1. 前端HTML修改

去掉原有固定的canvas和单文本input,增加容器用来存放动态生成的捕获结果,用数组形式的隐藏input存储所有图片数据:

<form action="" method="POST" enctype="multipart/form-data" dir="ltr">{% csrf_token %}
    <!-- 存储所有捕获的图片预览和对应数据的容器 -->
    <div id="captured-imgs-container"></div>
    <video id="player" controls autoplay></video>
    <!-- 给捕获按钮加type属性避免默认提交表单 -->
    <button type="button" id="capture">Capture</button>
    <button class="header pt-2  text-white px-4 p-1 rounded-lg mt-4">{% trans "save" %}</button>
</form>

2. 前端JS逻辑修改

每次点击捕获按钮时动态生成新的canvas渲染当前视频帧,同时生成对应的隐藏input存入图片base64数据:

const player = document.getElementById('player');
const captureButton = document.getElementById('capture');
const imgsContainer = document.getElementById('captured-imgs-container');
const constraints = {
  video: true,
};
  
captureButton.addEventListener('click', (e) => {
  e.preventDefault();
  // 动态创建新的canvas
  const newCanvas = document.createElement('canvas');
  newCanvas.width = 320;
  newCanvas.height = 240;
  const context = newCanvas.getContext('2d');
  // 绘制当前视频帧到新canvas
  context.drawImage(player, 0, 0, newCanvas.width, newCanvas.height);
  const imgFormat = newCanvas.toDataURL();
  
  // 创建隐藏input存储当前图片数据,name加[]让后端可以接收为数组
  const imgInput = document.createElement('input');
  imgInput.type = 'hidden';
  imgInput.name = 'documents[]';
  imgInput.value = imgFormat;
  
  // 把canvas(用于用户预览)和input(用于提交数据)都加入容器
  imgsContainer.appendChild(newCanvas);
  imgsContainer.appendChild(imgInput);
});
  
navigator.mediaDevices.getUserMedia(constraints)
  .then((stream) => {
    player.srcObject = stream;
  });  

3. Django后端处理

在视图函数中接收图片数组,解析base64数据存入数据库即可:

import base64
from django.core.files.base import ContentFile
from .models import YourImageModel # 替换为你自己的图片模型类

def save_captured_imgs(request):
    if request.method == "POST":
        # 获取所有捕获的图片base64数组
        img_list = request.POST.getlist('documents[]')
        for img_base64 in img_list:
            # 解析base64转为文件对象
            format, img_content = img_base64.split(';base64,')
            ext = format.split('/')[-1]
            img_file = ContentFile(base64.b64decode(img_content), name=f'captured_{id}.{ext}')
            # 存入数据库,image_field替换为你模型里的图片字段名
            YourImageModel.objects.create(image_field=img_file)
        # 后续自定义提交成功后的返回逻辑

如果多张图片需要关联到同一个主记录,先创建主记录,再循环创建图片记录关联到对应主记录即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:54:05