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

Django文件上传功能无法正常上传文件的问题求助

Django文件上传失败排查与修复

核心问题1:表单缺少文件上传必需的enctype属性

你的模板表单未设置enctype="multipart/form-data",这是Django接收上传文件的强制要求——没有该属性时,request.FILES会是空字典,文件根本无法传到后端。

修复模板代码:

修改form标签并清理冗余DOM结构:

<form action="{%url 'DataUpload' %}" method="POST" class="form-contact" enctype="multipart/form-data">
  {%csrf_token%}    
  <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">
    {{form.file}}
  </div>
  <button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent" type="submit">
    Submit
  </button>
</form>

核心问题2:文件保存路径拼接错误

handle_uploaded_file函数中,os.getcwd()+f是错误写法:f是Django的UploadedFile对象,不是字符串文件名,直接拼接会触发类型错误。同时直接依赖当前工作目录也不安全,建议指定明确的上传目录并使用os.path.join处理路径。

修复视图里的handle_uploaded_file函数:

import os
from django.conf import settings

def handle_uploaded_file(f):
    # 基于MEDIA_ROOT创建上传目录(需先在settings.py配置MEDIA_ROOT)
    upload_dir = os.path.join(settings.MEDIA_ROOT, 'uploads')
    # 目录不存在则自动创建
    os.makedirs(upload_dir, exist_ok=True)
    # 拼接合法的文件路径
    file_path = os.path.join(upload_dir, f.name)
    with open(file_path, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

需在settings.py中补充配置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

额外调试优化

  • 视图中添加表单错误打印,方便排查问题:
def DataUpload(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            print(request.FILES['file'])
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
        else:
            # 打印表单错误信息
            print(form.errors)
    else:
        form = UploadFileForm()
    return render(request, 'DataBase/upload.html', {'form': form})
  • URL配置改用Django2.0+推荐的path写法:
path('DataUpload/', views.DataUpload, name='DataUpload'),

内容的提问来源于stack exchange,提问作者jax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:20