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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:47:28