Django怎么上传大型文件_Python通过流式处理实现断点续传

Django默认文件上传失败因request.FILES将整个文件载入内存或临时文件,遇大文件易触发MemoryError、RequestEntityTooLarge等错误;其设计不支持大文件、无断点续传能力,需流式接收或前后端协同实现分片上传。

为什么直接用 Django 默认文件上传会失败

Django 的 request.FILES 默认把整个上传内容读进内存或临时文件,遇到几百 MB 甚至 GB 级文件时,容易触发 MemoryErrorRequestEntityTooLarge(Nginx)、Connection reset(超时),或者被 WSGI 服务器(如 Gunicorn)强制中断。这不是代码写得不对,而是设计上就不适合大文件——它假设上传是“短小、完整、可信”的。

  • Django 本身不提供断点续传逻辑,也不管理分片、校验、合并
  • FileUploadHandler 可以干预上传流,但仅限于“接收过程”,无法暴露底层 socket 或恢复上传状态
  • 所有“断点续传”必须由前端配合后端自定义接口实现,Django 只负责收、存、校验、拼接

如何用流式接收避免内存爆炸

核心是绕过 request.FILES,直接从 request.body 读取原始字节流,并边读边写入磁盘(或对象存储)。适用于单文件上传(非分片),但能撑住几 GB。

  • 必须在视图中设置 request.upload_handlers = [],否则 Django 仍会尝试解析 multipart
  • 使用 iter(request.body.readline, b'')request.body.read(chunk_size) 分块读取,chunk_size 建议设为 819265536
  • 写入时用 open(..., 'ab') 追加模式,避免重复打开文件消耗句柄
  • 示例片段:
    def upload_stream_view(request):
      if request.method != 'POST':
          return JsonResponse({'error': 'only POST'})
      request.upload_handlers = []  # 关键:禁用默认处理器
      file_path = '/tmp/upload.bin'
      with open(file_path, 'ab') as f:
          for chunk in iter(lambda: request.body.read(8192), b''):
              f.write(chunk)
      return JsonResponse({'received': os.path.getsize(file_path)})
    

注意:request.body 是一次性流,读完即空;不能和 request.POSTrequest.FILES 混用。

Uberduck

开源的AI语音社区,拥有5000+电影动漫声库,适合做同人配音

下载

断点续传必须前后端协同设计

真正的断点续传不是“Django 支持与否”的问题,而是要约定一套状态协议。常见做法是前端按固定大小切片(如 5MB/片),每片带唯一 upload_idchunk_index,后端记录已收哪些片。

  • 后端需提供三个接口:/upload/init/(创建上传会话,返回 upload_id)、/upload/chunk/(接收并落盘单片)、/upload/merge/(校验 MD5、按序合并)
  • 已上传分片状态建议存在 Redis 或数据库里,字段至少包括:upload_idtotal_chunksreceived_chunks(set 或 bitmap)
  • 合并时务必校验每片的 Content-MD5 或前端传来的 SHA256,防止网络错包
  • Nginx 需调大:client_max_body_sizeclient_body_timeoutproxy_read_timeout,否则单片上传就超时

容易被忽略的部署细节

  • Gunicorn 默认 --timeout 是 30 秒,大文件上传必然超时,必须调高(如 --timeout 600
  • 如果用 Nginx + Gunicorn,Nginx 的 proxy_buffering offproxy_request_buffering off 要开,否则 Nginx 会缓存整个请求体再转发,失去流式意义
  • 开发时用 runserver 测试流式上传不可靠——它不支持长连接和大 body,务必在真实部署环境验证
  • 文件名、MIME 类型等元信息无法从 request.body 获取,必须由前端通过 URL 参数或 JSON body 单独传,比如 ?filename=report.zip&content_type=application/zip

断点续传真正难的不是“怎么收”,而是“怎么管状态、怎么防并发冲突、怎么清理碎片、怎么应对客户端反复重试”。Django 只是管道,别指望它自动帮你记住哪片收到了。

相关推荐:

没时间做PPT怎么办?二狗PPT上传文档30分钟交付【救急】

二狗PPT提供30分钟内生成PPT的三种应急方案:一、官网上传文档自动排版;二、微信小程序拍照或粘贴文本生成;三、离线模板包+PowerPoint快速拼装。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您需要快速完成一份PPT但缺乏时间与设计经验,二狗PPT提供文档上传后30分钟内生成成品的服务。以下是几种可立即启用的应急操作路径: ...
· AI · 122114

蓝奏云怎么上传大于100M文件 蓝奏云大文件分卷上传方法【技巧】

蓝奏云免费用户单文件上传上限为100MB,超限文件可通过四种方法处理:一、分卷压缩后逐个上传;二、修改分卷后缀名绕过类型校验;三、使用LanzouTrans工具自动处理;四、调用rar.exe命令行分段打包上传。 如果您尝试将单个文件上传至蓝奏云,但系统提示“文件过大”或直接拒绝上传,则很可能是该文件体积超过了蓝奏云当前对免费用户设定的100MB单文件上限。以下是多种可行的上传方法: 一、分卷压缩...

TikTok小店怎么批量上传商品 TikTok Shop ERP工具推荐【神器】

批量上传是TikTok Shop快速上架商品的核心方式,包括:一、平台原生模板上传;二、API对接ERP自动化铺货;三、分销工具直连货源;四、妙手ERP入门推荐;五、赛狐ERP中大型首选。 如果您希望在TikTok Shop快速上架大量商品,但手动逐条录入耗时费力、易出错,则批量上传是必须掌握的核心操作方式。以下是实现该目标的多种可行方法及配套ERP工具推荐: 一、使用平台原生批量上传模板 该方法...

初见手机版如何上传本人照片到个人相册

在初见手机版中,将本人照片上传至个人相册,可为你的专属空间注入个性风采。接下来为你逐步说明操作流程。 首先,启动初见手机版应用。进入首页后,留意屏幕底部的一排功能入口,点击“我的”标签。 进入“我的”页面后,查找并点击“个人相册”模块,即可跳转至相册管理界面。 在相册页面中,通常可见一个醒目的“上传”按钮,轻触它即可开启上传流程。 此时,系统将弹出本地图片选择窗口,你可从手机相册或文件夹中挑选心仪...

千问支持流式输出吗,怎么实现?

需启用流式输出机制,其核心依赖Server-Sent Events(SSE)协议,通过持久化HTTP连接实时推送文本块;前端可用EventSource或fetch+ReadableStream监听,后端Spring Boot用SseEmitter、PHP用curl+WRITEFUNCTION、Ollama需穿透双重缓冲实现逐字响应。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解...
· AI · 152428

抖音创作者中心怎么发布视频_抖音电脑版作品上传详细流程

抖音电脑端发布视频需通过创作者服务平台网页端、官网快捷入口或PC客户端三种方式,须用抖音App扫码登录,视频格式限MP4/MOV且编码为H.264,大小与时长依渠道不同分别为4GB/15分钟或10GB/60分钟,封面推荐1080×1920像素,标题与标签需合规,发布前须校验编码、分辨率并完成新号冷启动。 如果您希望在电脑上通过抖音创作者中心发布视频,但无法完成上传或信息填写,则可能是由于未使用正确...

DeepSeek API支持流式输出吗?前端显示实时效果教程

DeepSeek API支持流式输出,可通过EventSource接收SSE、fetch+ReadableStream手动解析、后端代理转发及处理特殊结构四步实现。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ DeepSeek API确实支持流式输出,允许后端在生成响应过程中持续向前端推送文本片段,从而实现类似真人打字的实时显示效果。以下...
· AI · 95913

钉钉怎样上传直播课件_直播中展示PPT【教学】

钉钉直播中PPT无法显示可采用四种方法解决:一、电脑端专业模式屏幕共享;二、电脑端在线课堂上传调用;三、手机端上传群文件后调阅;四、转为钉钉文档幻灯片嵌入直播。 如果您在钉钉直播授课过程中需要向学生展示PPT课件,但发现课件无法正常加载或显示,可能是由于未正确上传、未启用屏幕共享、或设备端功能限制所致。以下是针对不同使用场景的多种上传与展示方法: 一、电脑端直播中直接屏幕共享PPT 该方法适用于已...