Django Rest Framework Excel文件上传失败:request.FILES为空求助
解决DRF Excel文件上传request.FILES为空的问题
核心问题定位
你提供的curl命令里,表单参数仅指定了文件路径但未设置字段名为file,而你的视图代码里用request.data['file']获取文件,两者字段名不匹配,这是导致拿不到文件的关键原因。
分步解决方案
1. 修正请求的表单字段名
不管用curl还是Postman,必须确保文件对应的表单字段名是file:
- 正确的curl命令:
curl --location 'http://localhost:8000/amm-api/upload/upload_workbook/' \ --form 'file=@"/Users/razan/Projects/HTS/ags-carmax/Robbie_Lisa-Branch.xlsx"'
- Postman操作:在
form-data选项卡中,把文件项的Key设置为file,Value选择本地Excel文件。
2. 优化视图代码(适配最新DRF)
最新DRF版本中,MultiPartParser是处理多表单上传的标准解析器,统一用request.data获取数据更稳妥,避免混用request.POST:
from rest_framework.parsers import MultiPartParser from rest_framework.response import Response from rest_framework import status from rest_framework.views import APIView import json class UploadWorkbookView(APIView): parser_classes = [MultiPartParser] def put(self, request, format=None): # 先校验文件是否存在 if 'file' not in request.data: return Response({'error': '未上传文件'}, status=status.HTTP_400_BAD_REQUEST) file_obj = request.data['file'] # 可选:校验文件格式 if not file_obj.name.endswith('.xlsx'): return Response({'error': '仅支持.xlsx格式文件'}, status=status.HTTP_400_BAD_REQUEST) # 处理表单数据(如果存在) form_data = json.loads(request.data.get('form', '{}')) print(file_obj, form_data) # 此处添加文件处理逻辑,比如保存文件或解析Excel内容 # 示例保存文件: # with open(f'./uploads/{file_obj.name}', 'wb+') as dest: # for chunk in file_obj.chunks(): # dest.write(chunk) return Response(status=status.HTTP_201_CREATED)
3. 检查项目基础配置
- 确保
settings.py中已启用django.middleware.csrf.CsrfViewMiddleware(本地测试可临时关闭,生产环境必须开启) - DRF默认已支持文件上传,无需额外配置解析器优先级,除非你自定义了全局解析器
关于FileUploadParser的说明
FileUploadParser适用于单文件上传场景,要求URL中携带文件名参数(如/?filename=xxx.xlsx),且请求Content-Type需为multipart/form-data或application/octet-stream,相比MultiPartParser更繁琐,因此处理带表单数据的文件上传时,优先用MultiPartParser。
内容的提问来源于stack exchange,提问作者nabiharaza
相关产品推荐
相关产品推荐

