Python Django怎么处理大文件断点续传_前端分片与后端合并文件块

雨涛大大_2569

雨涛大大_2569

2026-04-28

958人浏览

原创

分片上传需前后端严格对齐:前端传chunkIndex/totalChunks/identifier,后端禁用FILE_UPLOAD_MAX_MEMORY_SIZE、读request.body存为.part文件,合并前校验块完整性并追加写入,完成后校验hash并清理临时目录,nginx需配置超大body和超时。

python django怎么处理大文件断点续传_前端分片与后端合并文件块

前端分片上传时,File.slice() 的起始偏移量必须对齐后端预期

常见错误是前端用 file.slice(i * chunkSize, (i + 1) * chunkSize) 分片,但后端合并时没校验块序号或偏移量,导致文件错位、损坏。Django 默认不校验上传块的逻辑顺序,必须靠业务层约束。

实操建议:

  • 前端上传每个分片时,必须携带 chunkIndex(从 0 开始)、totalChunks、identifier(如文件名+大小+mtime 的 hash),不能只传序号
  • 后端用 identifier 作为临时目录名,把每个块存为 {chunkIndex}.part,避免不同用户同名文件冲突
  • 不要依赖 HTTP 请求顺序——HTTP/2 或并发上传下,chunkIndex=5 的请求可能比 chunkIndex=3 先到

Django 视图接收分片需禁用 FILE_UPLOAD_MAX_MEMORY_SIZE 并手动读取原始 body

Django 默认会把上传内容先缓存进内存或临时文件,但分片上传的单个请求体是二进制块,不是完整 multipart 表单;若走标准 request.FILES 流程,会触发 MultiValueDictKeyError 或解析失败。

实操建议:

  • 在视图中直接读 request.body,而非 request.FILES:
    def upload_chunk(request):
        if request.method == 'POST':
            chunk_data = request.body  # 原始字节流
            identifier = request.POST.get('identifier')
            chunk_index = int(request.POST.get('chunkIndex', 0))
            # ……保存到 media/chunks/{identifier}/{chunk_index}.part
  • 在 settings.py 中设 FILE_UPLOAD_MAX_MEMORY_SIZE = 0,强制所有上传走磁盘,避免大块数据撑爆内存
  • 用 request.content_type 校验是否为 application/octet-stream,防止伪造请求

合并分片时,用 os.path.join() 拼接路径并校验块完整性

合并前不检查缺失块或损坏块,会导致最终文件不可用。Django 不提供内置分片校验机制,必须手动实现。

python-flask-vue-creator
python-flask-vue-creator

创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。

下载

实操建议:

  • 合并前遍历 range(totalChunks),确认每个 {i}.part 文件存在且 size > 0;缺块则返回 400 Bad Request 并带缺失索引
  • 每个块写入最终文件时,用 open(..., 'ab') 追加模式,不要用 'wb' 覆盖——否则前面块全丢
  • 合并完成后,用 hashlib.sha256() 对最终文件重算 hash,与前端传来的 fileHash 对比,不一致则删掉并报错
  • 临时分片目录(如 media/chunks/xxx/)必须在合并成功后立即 shutil.rmtree(),否则磁盘被占满

生产环境必须加 nginx 代理层处理超大 body 和超时

Django 自身无法可靠处理几百 MB 以上的单次请求体;不配反向代理的话,容易触发 Connection reset by peer 或 Request Entity Too Large 错误。

实操建议:

  • 在 nginx.conf 中设置:
    client_max_body_size 2G;
    client_body_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
  • 禁用 client_body_in_file_only on(除非你真需要落盘到 nginx 临时区),默认 off 即可
  • 如果用 gunicorn,确保 --timeout 300 且 --keep-alive 5,避免 worker 在合并中途被杀

分片上传真正的复杂点不在“怎么拼”,而在于“怎么兜底”:网络中断后前端如何知道该从哪块续、后端如何识别重复上传、失败后怎么清理残留。这些逻辑一旦漏掉一环,用户就会卡在 99%。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 前端 django

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2763

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6970

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6446

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2763

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6023

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6970

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6738

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

963

5

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习