Flask大文件分片上传_接收前端分块Blob并组合追加写入文件

阿瑶酱_6172

阿瑶酱_6172

2026-03-20

941人浏览

原创

flask接收前端分片blob需用request.files['file'].read()立即读取字节,避免请求体被消耗;分片应追加写入临时文件并记录已接收索引,合并前校验哈希,完成后原子重命名,并定时清理过期.part文件。

flask大文件分片上传_接收前端分块blob并组合追加写入文件

Flask 怎么接收前端传来的分片 Blob?

前端用 File.prototype.slice() 或 Blob.slice() 切分后,通常以 FormData 发送,每个分片带固定字段(如 file、chunkIndex、totalChunks、fileName)。Flask 侧不能直接用 request.files.get('file') 就完事——它能拿到,但必须立刻读取内容,否则后续请求体被丢弃,导致后续分片读不到。

  • 务必用 request.files['file'].read() 拿到原始字节,别依赖 .save(),它内部会调用 read() 但可能干扰流状态
  • 前端若用 fetch + FormData,确保没手动设置 Content-Type 头,否则 Flask 解析 multipart/form-data 会失败,报 400 Bad Request
  • 分片标识建议统一用整数 chunkIndex(从 0 开始),避免前端传字符串 "0" 导致 Python 比较出错

怎么安全地把分片追加写入同一个临时文件?

不能每个分片都 open(..., 'w') 覆盖写,也不能全加载进内存再拼——大文件(比如 2GB 视频)会 OOM。正确做法是用 open(..., 'ab') 追加,并按 chunkIndex * chunkSize 控制写入位置。但注意:HTTP 请求无序,分片可能乱序到达。

  • 先用 fileName + totalChunks 生成唯一临时文件名(例如 f"{safe_name}_{total_chunks}.part"),避免不同用户同名文件冲突
  • 写入前检查该分片是否已存在(可建个 {chunkIndex: True} 的 Redis 或本地 JSON 记录),防止重复写入损坏文件
  • 不要用 seek() 定位写入——分片大小不严格相等(最后一块更小),seek 容易偏移,老老实实追加 + 外部记录顺序更稳

request.files 读取后为什么下个分片就拿不到数据?

这是 Flask(基于 Werkzeug)的底层行为:请求体只能被消费一次。request.files、request.form、request.get_data() 任意一个触发读取,其余就会返回空。常见错误是先 print request.form 调试,再取 request.files,结果后者为空。

  • 调试时改用 request.get_data(cache=True) 一次性缓存原始 body,再用 ImmutableMultiDict 手动解析 multipart(需引入 werkzeug.formparser),但太重——推荐直接用 request.files 和 request.form,且只用一次
  • 如果必须同时访问 form 和 files,确保顺序是:先取 request.files 并 .read(),再取 request.form;反过来就会失败
  • 用 curl -F 测试时,别加 -H "Content-Type: ...",让 curl 自动设 boundary

合并完成后的文件怎么校验完整性?

前端传的 totalChunks 和 chunkIndex 只能防漏,不能防损坏。真正可靠的是哈希比对:前端上传前算整个文件的 md5 或 sha256,传给后端;合并完再算一次临时文件的哈希。

  • 别在内存里读全文件算哈希——用 hashlib.md5() 分块更新:for chunk in iter(lambda: f.read(8192), b'')
  • 合并动作本身要原子化:先写到 xxx.part,校验通过后再 os.replace() 成正式文件,避免程序崩溃时留下半成品
  • 生产环境务必加超时清理:用定时任务扫 *.part 文件,超过 24 小时未完成的直接删,不然磁盘会被占满

实际最难的不是分片逻辑,是处理网络中断后前端重传、服务重启时分片状态丢失、以及多进程部署下共享临时状态的问题——这些没法靠单个 Flask route 解决,得靠外部存储兜底。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

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

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

下载

相关标签:

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

相关专题

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

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

2023.08.11

2523

5

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

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

2023.10.09

5463

6

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

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

2024.03.19

6490

13

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

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

2024.03.22

6098

10

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

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

2024.05.22

863

5

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

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

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4544

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26757

23

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习