Django不使用表单实现文件上传大小限制及文件获取方法咨询
解决方案
核心问题:文件数据不在request.POST中
文件上传的数据不会存入request.POST,而是存储在request.FILES对象里,这是Django处理文件上传的标准机制。另外你的HTML表单必须声明enctype="multipart/form-data",否则浏览器无法正确传递文件数据。
步骤1:修正HTML表单
确保form标签包含enctype="multipart/form-data"属性,同时加上Django必需的CSRF令牌:
<form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" class="shadow-sm form-control" onchange="imageLimition(event)" id="image" name="image" required> <button type="submit">提交</button> </form>
步骤2:修改后端视图与验证函数
调整register视图从request.FILES获取文件对象,并修正验证函数的逻辑:
from django.core.exceptions import ValidationError def register(request): if request.method == 'POST': # 从request.FILES中获取上传的文件对象 file_obj = request.FILES.get('image') if file_obj: try: validate_file_size(file_obj) # 此处可添加文件保存或后续业务逻辑 print("文件大小符合要求") except ValidationError as e: print(e.message) else: print("未检测到上传文件") # 其他视图逻辑... def validate_file_size(file_obj): filesize = file_obj.size # 限制文件最大为512KB if filesize > 512 * 1024: raise ValidationError("文件大小不能超过512KB") return file_obj
步骤3:前端提前验证(可选但推荐)
利用onchange事件在前端先校验文件大小,减少无效请求:
function imageLimition(event) { const file = event.target.files[0]; const maxSize = 512 * 1024; // 512KB if (file.size > maxSize) { alert("文件大小不能超过512KB"); event.target.value = ""; // 清空已选择的文件 } }
注意事项
- 前端验证仅为提升用户体验,后端验证是必须的,用户可以绕过前端限制直接提交大文件。
- 必须保留
{% csrf_token %},否则Django会拦截POST请求(CSRF保护机制)。
内容的提问来源于stack exchange,提问作者vahid khazaei
相关产品推荐
相关产品推荐

