使用 JavaScript 和 Django 将录制的视频文件保存到文件系统

使用 javascript 和 django 将录制的视频文件保存到文件系统

本文档旨在指导开发者如何使用 JavaScript 录制视频,并通过 Django 后端将其保存到服务器的文件系统中。我们将利用 Fetch API 从前端上传视频文件,并在 Django 视图中处理文件存储,同时解决常见的浏览器兼容性问题。

前端:使用 JavaScript 录制和上传视频

首先,我们需要修改 JavaScript 代码,以便将录制的视频数据通过 Fetch API 发送到 Django 后端。关键在于将 Blob 对象转换为 File 对象,并使用 FormData 对象进行上传。

1. 获取 CSRF Token

Django 默认启用 CSRF 保护,因此需要在请求头中包含 CSRF Token。可以通过以下 JavaScript 函数获取 Cookie 中的 CSRF Token:

立即学习“Java免费学习笔记(深入)”;

function getCookie(name) {  const value = `; ${document.cookie}`;  const parts = value.split(`; ${name}=`);  if (parts.length === 2) return parts.pop().split(';').shift();}

2. 创建上传函数

创建一个名为 upload 的异步函数,该函数接收 FormData 对象作为参数,并使用 Fetch API 将其发送到 Django 后端:

async function upload(formData) {  try {    const response = await fetch("/video-app", { // 替换为你的 Django 视图 URL      method: "POST",      headers: {        "X-CSRFToken": getCookie('csrftoken'),      },      body: formData,    });    const result = await response.json();    console.log("Response:", result);  } catch (error) {    console.error("Error:", error);  }}

3. 修改 Download 按钮的事件监听器

修改 downloadButton 的事件监听器,使其在下载视频的同时,也将其上传到服务器:

downloadButton.addEventListener('click', () => {  const blob = new Blob(recordedBlobs, {type: 'video/mp4'});  // 上传到服务器  const formData = new FormData();  formData.append("video", new File([blob], 'my-interview.mp4')); // 自定义文件名  upload(formData);  // 客户端下载  const url = window.URL.createObjectURL(blob);  const a = document.createElement('a');  a.style.display = 'none';  a.href = url;  a.download = 'w3-coder-recorder-test.mp4'; // 客户端下载的文件名  document.body.appendChild(a);  a.click();  setTimeout(() => {    document.body.removeChild(a);    window.URL.revokeObjectURL(url);  }, 100);});

后端:Django 视图处理文件上传

接下来,我们需要在 Django 视图中处理接收到的视频文件,并将其保存到文件系统中。

1. 修改 views.py

修改 video_interview 视图函数,使其能够接收上传的视频文件,并将其保存到数据库中:

from django.http import JsonResponsefrom django.contrib.auth.decorators import login_required@login_requireddef video_interview(request):    if request.method == 'POST':        interview = request.FILES.get('video')        if interview is not None:            VideoInterview.objects.create(                candidate = request.user,                document = interview             )            return JsonResponse({'error_code': 0})  # 成功        else:            return JsonResponse({'error_code': 1})  # 失败    return render(request, 'test_app/video_app.html') # 渲染页面,确保模板存在

2. 配置 URL

确保在 urls.py 中配置了对应的 URL 路由:

from django.urls import pathfrom . import viewsurlpatterns = [    path('video-app/', views.video_interview, name='video_interview'),]

3. 确保 VideoInterview 模型正确配置

检查 models.py 中的 VideoInterview 模型,确保 document 字段的 upload_to 参数正确设置,以便文件能够保存到指定目录。

class VideoInterview(models.Model):    def __str__(self):        return str(self.candidate)    candidate = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)    description = models.CharField(max_length=100, blank=True, verbose_name="Leírás")    document = models.FileField(upload_to='documents/videointerviews', verbose_name="CV")    datetime = models.DateTimeField(auto_now_add=True)

4. 移除 VideoInterviewUploadForm

由于我们不再使用 Django Form 进行文件上传,因此可以移除 forms.py 中的 VideoInterviewUploadForm。

解决浏览器兼容性问题

原问题中提到在 Firefox 浏览器中出现 DOMException: Starting videoinput failed 错误,这通常是由于权限问题或设备不可用导致的。

1. 检查权限

确保用户已授予浏览器访问摄像头和麦克风的权限。

2. 处理异常

在 init 函数中,更详细地处理 navigator.mediaDevices.getUserMedia 抛出的异常,以便更好地诊断问题:

async function init(constraints) {  try {    const stream = await navigator.mediaDevices.getUserMedia(constraints);    handleSuccess(stream);  } catch (e) {    console.error('navigator.getUserMedia error:', e);    errorMsgElement.innerHTML = `navigator.getUserMedia error:${e.name} - ${e.message}`; // 更详细的错误信息  }}

3. 检查设备可用性

在调用 getUserMedia 之前,可以先检查设备是否可用。

注意事项和总结

错误处理: 在前端和后端都添加适当的错误处理机制,以便在出现问题时能够及时发现并解决。文件大小限制: 考虑设置文件大小限制,以防止上传过大的视频文件。可以在 Django settings.py 中配置 DATA_UPLOAD_MAX_MEMORY_SIZE。安全: 确保对上传的文件进行安全检查,以防止恶意代码注入。文件名: 为上传的文件生成唯一的文件名,以避免文件名冲突。可以使用 UUID 或时间戳。

通过以上步骤,我们可以使用 JavaScript 录制视频,并通过 Django 后端将其保存到服务器的文件系统中。使用 Fetch API 进行文件上传可以避免使用 Django Form,从而简化代码并提高灵活性。同时,需要注意处理浏览器兼容性问题,并添加适当的错误处理机制。

以上就是使用 JavaScript 和 Django 将录制的视频文件保存到文件系统的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1369329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 09:34:40
下一篇 2025年12月14日 09:34:57

相关推荐

  • 前端录制视频直传Django:Fetch API与CSRF安全实践

    本教程将详细探讨如何利用JavaScript的MediaRecorder API在前端录制视频,并通过Fetch API将录制好的视频文件安全、高效地上传至Django后端的文件系统和数据库。文章将深入讲解CSRF令牌处理、FormData的构建与使用,以及Django视图层如何接收和保存这些上传的…

    好文分享 2025年12月14日
    000
  • JavaScript与Django实现录制视频文件上传与保存教程

    本教程详细介绍了如何结合JavaScript的MediaRecorder API进行浏览器端视频录制,并通过Fetch API将录制好的视频文件高效、安全地上传至Django后端。文章涵盖了前端视频流处理、CSRF令牌管理、FormData构建,以及后端Django视图中接收文件、创建模型实例并保存…

    2025年12月14日
    000
  • Python中复杂字典的精确类型描述:Pydantic实践指南

    本文旨在解决Python中对复杂、嵌套字典结构进行精确类型描述的挑战。通过引入Pydantic库,我们展示了如何利用其BaseModel和Python标准类型提示来定义清晰、可验证的数据模型,从而实现对复杂数据结构的强类型支持、数据验证和便捷的数据转换,显著提升代码的可读性和健壮性。 引言:Pyth…

    2025年12月14日
    000
  • Pythonic 类间变量传递:利用实例引用共享动态数据

    本文探讨Python中如何在不同类之间高效、优雅地共享动态变化的变量。针对传统方法(如构造函数传递或每次调用时作为参数传递)的局限性,我们提出并演示了一种Pythonic解决方案:通过在构造函数中传递一个类的实例引用,允许接收类直接访问并利用源类中的最新数据,从而实现更简洁、更具封装性的类间协作。 …

    2025年12月14日
    000
  • Python中复杂字典结构的高效类型定义与数据验证:Pydantic实战指南

    本教程旨在解决Python中对复杂、嵌套字典结构进行精确类型定义和数据验证的挑战。通过引入Pydantic库,文章详细演示了如何利用BaseModel创建强类型的数据模型,实现类似Go语言中结构体的精确描述,从而提升代码的健壮性、可读性与开发效率。 引言:Python复杂字典类型定义的困境 在pyt…

    2025年12月14日
    000
  • dbt模型完整SQL预览:查看包含头部、宏和钩子的最终执行语句

    本文旨在解决dbt用户在模型执行前无法预览完整SQL语句的问题。传统dbt compile仅显示SELECT部分,而dbt run后才能在target/run中查看完整SQL。通过引入dbt show命令,用户现在可以预先查看包含INSERT/MERGE INTO等SQL头部、宏和钩子的最终执行语句…

    2025年12月14日
    000
  • DBT模型预编译:利用dbt show查看完整生成SQL的实践指南

    dbt compile命令在预编译DBT模型时,无法展示包含INSERT INTO、MERGE INTO等头部语句、宏展开及钩子的完整SQL。本文旨在介绍如何利用dbt show命令,在模型实际运行之前,预览包含所有必要头部信息、宏和钩子的完整生成SQL,从而实现更彻底的SQL审计、调试,并避免运行…

    2025年12月14日
    000
  • 深入解析 DBT:预执行查看完整 SQL 及 DDL/DML 语句

    本文旨在解决 DBT 用户在模型运行前无法查看包含 DDL/DML 头部、宏和钩子在内的完整可执行 SQL 的痛点。通过详细介绍 dbt show 命令,我们将学习如何预先审计和调试 DBT 生成的完整 SQL 语句,尤其是在处理 sql_header 等复杂配置时的应用,从而提升开发效率和代码质量…

    2025年12月14日
    000
  • 预执行SQL审计:使用dbt show查看完整的DBT生成语句

    dbt compile命令在查看DBT模型生成的SQL时存在局限性,它无法展示完整的DML/DDL头部(如INSERT INTO、MERGE INTO)以及自定义的sql_header配置。本文将详细介绍如何利用dbt show命令,在不实际执行模型的情况下,查看包括SQL头部、宏和钩子在内的完整编…

    2025年12月14日
    000
  • 解决Python中Literal类型赋值引发的Mypy类型检查错误

    在Python中处理Literal类型时,将动态字符串值赋给Literal变量常会引发Mypy类型检查错误,即使经过运行时验证也未能幸免。本文将详细介绍如何使用typing.get_args配合typing.cast或更优雅地利用typing.TypeGuard来解决这些问题,确保代码在类型安全的同…

    2025年12月14日
    000
  • Python XML解析与XPath高级筛选教程

    本教程详细介绍了如何使用Python的xml.etree.ElementTree模块,结合XPath表达式,高效且精准地从复杂XML文件中提取特定数据,而无需修改原始XML结构。内容涵盖XML加载、基础遍历以及利用XPath进行多条件属性筛选的实用技巧与代码示例。 引言 在处理各种数据交换和配置场景…

    2025年12月14日
    000
  • Django 文件上传与处理:获取文件路径的正确实践

    本文详细阐述了在 Django 应用中正确处理文件上传、保存并获取其存储路径的方法。通过分析常见错误,提供优化的代码示例,指导开发者如何安全、高效地接收用户上传的文件,利用 default_storage 进行存储,并将生成的存储路径传递给后续的文件处理函数,确保数据流的准确性和程序的健壮性。 Dj…

    2025年12月14日
    000
  • Django 文件上传与路径管理:确保数据处理的正确路径

    本教程详细阐述了在Django应用中处理文件上传的最佳实践,特别是如何从HTTP请求中正确获取上传文件、将其安全地保存到存储系统,并获取其存储路径。我们将重点讲解request.FILES的使用、default_storage.save()的返回值,以及如何将正确的文件路径传递给后续的文件处理函数,…

    2025年12月14日
    000
  • 利用BeautifulSoup定位字符串并获取其上下文标签

    本教程详细介绍了如何使用BeautifulSoup库在HTML文档中查找特定字符串,并进一步定位这些字符串所在的父级HTML元素。通过结合find_all(string=…)和find_parent()方法,开发者可以精确识别目标字符串的上下文结构,从而实现更精准的数据抓取和页面解析。文…

    2025年12月14日 好文分享
    000
  • Beautiful Soup 中定位字符串及其父标签

    本文旨在介绍如何使用 Beautiful Soup 库在 HTML 或 XML 文档中定位特定的字符串,并获取包含该字符串的父标签。通过使用正则表达式进行字符串匹配,结合 find_all() 和 find_parent() 方法,可以有效地提取目标字符串所在的标签信息,从而为后续的数据抓取和处理提…

    2025年12月14日
    000
  • BeautifulSoup教程:高效定位网页中特定字符串的父元素

    本教程详细讲解如何利用BeautifulSoup库在网页内容中精准定位特定字符串所在的父HTML元素。通过结合find_all和find_parent方法,我们不仅能识别字符串的存在,还能获取其上下文结构,从而为后续的网页数据提取提供稳定且可靠的定位策略,避免因字符串值变化而导致爬取失败。 在进行网…

    2025年12月14日 好文分享
    000
  • 优化Discord机器人“监禁”命令:角色权限管理与常见陷阱解析

    本教程旨在解决Discord机器人“监禁”命令无法正常工作的问题,重点讲解如何正确配置“被监禁”角色的频道权限,以及在移除用户角色时避免因尝试移除@everyone角色而导致的错误。通过优化权限设置逻辑和增强错误处理,确保机器人命令的稳定性和可靠性。 在开发discord机器人时,实现如“监禁”(j…

    2025年12月14日
    000
  • Discord机器人“禁闭”指令的实现与优化

    本教程详细探讨了Discord机器人中“禁闭”指令(Jail Command)的实现方法与常见问题解决方案。内容涵盖了如何创建和管理“禁闭”角色、正确配置频道权限覆盖以限制用户访问、以及在移除用户角色时如何优雅地处理特殊角色(如@everyone)以避免潜在错误。通过优化代码结构和强化权限检查,旨在…

    2025年12月14日
    000
  • 使用 Supervisor 管理不同 Git 分支的应用部署

    本文旨在讲解如何利用 Supervisor 管理部署在不同 Git 分支上的应用程序。Supervisor 本身不直接感知 Git 分支,但通过在不同目录下检出不同分支的代码,并配置 Supervisor 针对不同目录下的应用程序进行管理,可以实现灵活的部署方案。这种方法允许你在同一服务器上运行不同…

    2025年12月14日
    000
  • 使用 Supervisor 管理不同 Git 分支部署

    本文介绍了如何使用 Supervisor 管理部署在不同 Git 分支上的应用程序。Supervisor 本身不直接与 Git 交互,它只负责执行文件系统中的程序。因此,要让 Supervisor 运行不同分支的代码,需要将不同分支的代码检出到不同的目录,然后配置 Supervisor 针对不同的目…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信