如何使用drf-chunked-upload库上传文件,解决无分片文件提交报错
drf-chunked-upload 报错
No chunk file was submitted解决方案 你遇到的报错核心原因是请求参数与drf-chunked-upload的默认要求不匹配,按以下步骤修正即可:
直接错误原因
drf-chunked-upload默认要求分片文件的请求字段名为chunk,你的代码中使用了file作为字段名,服务端无法识别到上传的分片文件,因此抛出该报错。
完整正确用法示例
除了字段名修正外,还要遵循分片上传的完整逻辑:先按分片大小逐段上传文件,全部分片上传完成后调用合并接口生成完整文件。
import requests import os # 自定义每个分片的大小,示例为2MB CHUNK_SIZE = 2 * 1024 * 1024 file_path = "testfile.txt" base_url = 'http://127.0.0.1:8000/chunked_upload/' file_total_size = os.path.getsize(file_path) # 用于标记同一次上传任务的ID,首次上传后由服务端返回 upload_id = None with open(file_path, "rb") as f: current_offset = 0 while current_offset < file_total_size: # 读取当前分片内容 chunk_content = f.read(CHUNK_SIZE) current_chunk_length = len(chunk_content) current_end = current_offset + current_chunk_length - 1 headers = { "Content-Range": f"bytes {current_offset}-{current_end}/{file_total_size}" } post_data = { "filename": os.path.basename(file_path), } # 非首次上传需要带上服务端返回的upload_id绑定任务 if upload_id: post_data["upload_id"] = upload_id # 上传分片,字段名必须为chunk resp = requests.put( base_url, headers=headers, data=post_data, files={"chunk": chunk_content} ) resp.raise_for_status() resp_data = resp.json() upload_id = resp_data["upload_id"] current_offset += current_chunk_length # 全部分片上传完成后,发起合并请求 merge_resp = requests.post( base_url, data={ "upload_id": upload_id, # 如果服务端开启了MD5校验,需要传入文件完整MD5值,否则可以省略 # "md5": "your_file_full_md5" } ) merge_resp.raise_for_status() print("文件上传完成", merge_resp.json())
其他注意事项
- 如果后端自定义了分片字段名,需要和后端配置的字段名保持一致,默认值为
chunk - 分片大小不能小于后端配置的最小分片阈值,默认无最低限制,可在Django的REST_FRAMEWORK配置中调整
- 如果不需要断点续传能力,也可以选择一次性上传整个文件,只需把CHUNK_SIZE设置为大于文件总大小即可
内容的提问来源于stack exchange,提问作者leach
相关产品推荐
相关产品推荐

