Postman测试DRF多文件上传出现文件类型验证错误求助
问题分析与解决方案
问题根源
你遇到的错误有两个核心原因:
- Postman请求参数格式不匹配:DRF的
ListField(FileField)期望接收数组形式的文件参数,但当前Postman设置未正确传递数组格式的文件列表,导致DRF无法识别每个文件。 - 视图代码逻辑错误:处理序列化后的数据时,错误使用
data.pop(file_list)——这里file_list是data中的文件列表值,而pop方法需要传入键名字符串。
步骤1:修正Postman请求设置
在Postman中按以下方式配置请求:
- 请求方法选
PUT,填写接口URL - 切换到
Body标签,选择form-data格式 - 关键配置:每个文件的键名设为
file_list[](带方括号),依次添加4个图片文件;若Postman版本支持,也可直接用file_list作为键名,点击"Add Files"多选4个文件(确保Postman将其作为数组发送) - 无需手动修改
Content-Type,Postman会自动设置为multipart/form-data
步骤2:修正Django视图代码
以下是修正后的完整视图:
class PostImageValidate(APIView): permission_classes = (IsAuthenticated, IsNotSuspended) def put(self, request): serializer = TempImageSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.validated_data # 直接通过键名获取并移除文件列表 uploaded_files = data.pop('file_list') results = [] for file in uploaded_files: results.append({"filename": file.name, "size": file.size, "status": "Processed"}) return Response( { "message": "Images processed successfully", "results": results, "number of items": len(results) }, status=status.HTTP_201_CREATED )
说明:去掉了
request_data = request.data.dict(),因为DRF的request.data已是可直接使用的对象,转成dict可能丢失数组格式参数信息。
步骤3:序列化器无需修改
你的TempImageSerializer配置正确,已声明file_list为非空文件列表:
class TempImageSerializer(serializers.Serializer): file_list = serializers.ListField( child=serializers.FileField(max_length=150, allow_empty_file=False), allow_empty=False )
测试验证
按上述配置重新发起请求,DRF将正确解析4个文件,返回预期响应:
{ "message": "Images processed successfully", "results": [ {"filename": "img1.jpg", "size": 12345, "status": "Processed"}, {"filename": "img2.jpg", "size": 67890, "status": "Processed"}, {"filename": "img3.jpg", "size": 11223, "status": "Processed"}, {"filename": "img4.jpg", "size": 44556, "status": "Processed"} ], "number of items": 4 }
内容的提问来源于stack exchange,提问作者Earthling
相关产品推荐
相关产品推荐

