You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apache Bench中传递含文件对象的Django MultiValueDict?

用ab命令向Django视图上传文件的正确姿势

我来帮你搞定这个问题——用ab命令给Django视图传文件,让request.FILES能正确识别到,核心在于构造符合multipart/form-data规范的请求体,而不是随便传个普通文本文件。下面一步步来:

1. 构造正确的请求体文件

假设你要上传一个名为test.jpg的图片,先创建一个请求体模板文件(比如叫upload_payload.txt),内容结构必须严格遵循multipart格式:

--1234567890
Content-Disposition: form-data; name="myfile"; filename="test.jpg"
Content-Type: image/jpeg

[这里插入test.jpg的二进制内容,不能有多余空格或换行]
--1234567890--

关键细节要注意:

  • --1234567890是你指定的分隔边界(boundary),要和后面ab命令里的-T参数完全一致,前后的--不能少,结尾的--1234567890--是整个请求的结束标记。
  • name="myfile"必须和Django视图里request.FILES.getlist('myfile')的参数完全对应,否则Django找不到文件。
  • Content-Type要匹配文件类型:图片用image/jpeg/image/png,文档用application/pdf,视频用video/mp4等,别瞎填。

快速生成正确请求体(用bash命令)

手动插入二进制内容容易出错,用下面的命令自动生成更靠谱:

# 先写入头信息
echo -n "--1234567890
Content-Disposition: form-data; name=\"myfile\"; filename=\"test.jpg\"
Content-Type: image/jpeg

" > upload_payload.txt

# 把图片的二进制内容追加进去
cat test.jpg >> upload_payload.txt

# 写入结束标记
echo -n "
--1234567890--" >> upload_payload.txt

2. 执行ab命令

用构造好的upload_payload.txt作为请求体,执行ab命令:

ab -n 10 -c 2 -p upload_payload.txt -T "multipart/form-data; boundary=1234567890" http://localhost/app/media

3. 上传多个文件的情况(适配getlist)

如果要上传多个文件(对应视图里的getlist),只需要在请求体里重复多个文件块即可:

--1234567890
Content-Disposition: form-data; name="myfile"; filename="test1.jpg"
Content-Type: image/jpeg

[test1.jpg的二进制内容]
--1234567890
Content-Disposition: form-data; name="myfile"; filename="test2.pdf"
Content-Type: application/pdf

[test2.pdf的二进制内容]
--1234567890--

同样用bash命令把多个文件依次合并到payload里就行。

几个避坑提醒

  • 确保boundary字符串唯一,不要和文件内容里的任何字符串重复,否则会导致Django解析multipart数据失败。
  • 所有换行必须是LF(\n),不能用Windows的CRLF(\r\n),否则可能触发解析错误。
  • ab命令用-p参数时默认发送POST请求,所以要确保你的Django视图接受POST方法(比如用@require_http_methods(["POST"])装饰器)。

内容的提问来源于stack exchange,提问作者RaviKiran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:15:48