Django分片上传需避免内存加载,用request.FILES.get('file')接收单片,配合identifier、chunkIndex等元数据校验;分片独立存储并原子覆盖,合并前检查完整性并加锁;提供check接口支持断点续传,强制超时清理与路径防护。
如何用 Django 接收前端传来的文件分片
核心是别把整个文件当
一次性读进内存。Django 默认会把小文件加载到内存,大文件写入临时文件,但分片上传时你收到的只是某个
,不是完整文件,所以必须手动处理原始 body 或指定字段名接收。
常见做法是前端按约定字段(如
)上传单个分片,后端用
拿到
或
。但要注意:
确保 Nginx / uWSGI 配置不限制单次请求体大小(如 Nginx 的
至少设为 100m)
禁用 Django 的文件上传中间件自动解析(不必要),直接从
取值即可
分片通常带元数据:当前序号
、总片数
、文件唯一标识
,这些走
,别混在文件字段里
怎样安全合并分片并避免重复写盘
不能等所有分片收齐再合并——万一用户中途关浏览器,磁盘上就堆了一堆孤儿 chunk。更稳妥的做法是每个分片落地为独立临时文件(带
和
命名),合并逻辑只在「确认上传完成」时触发。
关键控制点:
立即学习
“
Python免费学习笔记(深入)
”;
用
存每片,目录需提前创建且权限可控
合并前先检查是否收齐:
,但注意竞态——多个请求可能同时检查+合并,加文件锁或数据库状态位(如
)
合并时用
追加写入目标文件,不要用
全部载入内存;用
流式拷贝
断点续传依赖哪些客户端行为和后端校验
断点续传不是后端单方面能实现的,它依赖前端准确汇报「已传哪些片」。后端只需提供一个查询接口(如
),返回已存的
列表即可。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
但容易被忽略的是校验环节:
仅靠
不足以防冲突,建议用文件名 + 文件大小 + 时间戳生成强标识,或直接用文件内容 hash(首尾各 1MB 的
拼接)
前端重传同一片时,后端要覆盖写,而非追加——否则文件错乱;可用
确保原子性
超时清理必须做:对超过 24 小时未完成的
,后台任务扫描并删其所有 chunk,否则磁盘悄悄爆掉
Django 视图中怎么组织分片上传逻辑才不易出错
别在一个视图里塞接收、校验、合并、清理全部逻辑。拆成三个最小职责单元:
视图:只存单片,校验
和
合法性,返回 200 或 400
视图:只查已传片列表,不做任何写操作,供前端决定从哪片继续
视图:只在收到
且全部存在时执行合并,并标记 session 完成;失败则留日志,不静默吞异常
合并失败时,不要删已存分片——保留它们能让用户下次直接续传,而不是重头开始。
最麻烦的其实是 chunk 文件名编码和路径遍历防护。哪怕用了
,也要用
过滤掉
类路径穿越,否则攻击者能往任意目录写分片。
request.FILESchunkfilerequest.FILES.get('file')InMemoryUploadedFileTemporaryUploadedFileclient_max_body_sizerequest.FILESchunkIndextotalChunksidentifierrequest.POSTidentifierchunkIndexos.path.join(upload_dir, f"{identifier}_{chunkIndex}")len(os.listdir(chunk_dir)) == int(totalChunks)UploadSession.status == 'completed'open(..., 'ab')read()shutil.copyfileobj(chunk_file, target_file)/api/upload/check/?identifier=xxxchunkIndexidentifiersha256os.replace()identifierupload_chunkidentifierchunkIndexcheck_chunksmerge_chunkstotalChunksidentifieros.path.basename(identifier)../