如何在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
相关产品推荐
相关产品推荐

