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

Django如何获取上传文件夹的根目录、子目录及文件信息

Django上传文件夹时获取完整目录结构解决方案

你当前的问题核心是没用到浏览器传递的完整相对路径信息——当用directory属性上传文件夹时,每个文件的name字段其实包含了相对于上传根文件夹的完整路径(比如sub_folder/file.txt),而不是只有文件名。下面直接给你修改后的实现方案:

1. 保持HTML代码不变

你的HTML标签已经正确开启了文件夹上传功能,无需修改:

<input type="file" name="file_name" multiple="true" webkitdirectory="true" directory="true"/>

2. 修改Python代码获取目录结构

方案一:解析并打印完整路径与目录结构

def uploader_folder(request):
    data = {}
    if request.method == 'POST':
        files = request.FILES.getlist('file_name')
        # 用来存储整个文件夹的结构
        folder_structure = {}

        for uploaded_file in files:
            # 获取文件的完整相对路径(包含子目录)
            full_relative_path = uploaded_file.name
            # 拆分路径为目录和文件名
            path_segments = full_relative_path.split('/')
            filename = path_segments[-1]
            dir_path = path_segments[:-1]

            # 打印基础信息
            print(f"完整相对路径: {full_relative_path}")
            print(f"文件名: {filename}")
            print(f"所在目录: {'/'.join(dir_path) if dir_path else '根目录'}\n")

            # 构建层级目录结构字典
            current_node = folder_structure
            for dir_name in dir_path:
                if dir_name not in current_node:
                    current_node[dir_name] = {'subdirs': {}, 'files': []}
                current_node = current_node[dir_name]['subdirs']
            current_node.setdefault('files', []).append(filename)

        # 可以把结构返回给前端或者存储到数据库
        data['folder_structure'] = folder_structure
    return render(request, 'your_upload_template.html', data)

方案二:保存文件时同步创建目录结构

如果需要把上传的文件夹完整保存到服务器(保留子目录),可以这样做:

import os
from django.conf import settings
from django.shortcuts import render

def uploader_folder(request):
    data = {}
    if request.method == 'POST':
        files = request.FILES.getlist('file_name')
        # 服务器上的根保存目录
        server_upload_root = os.path.join(settings.MEDIA_ROOT, 'uploaded_folders')

        for uploaded_file in files:
            full_relative_path = uploaded_file.name
            # 拼接服务器上的完整保存路径
            server_full_path = os.path.join(server_upload_root, full_relative_path)
            # 创建所需的子目录(如果不存在)
            os.makedirs(os.path.dirname(server_full_path), exist_ok=True)
            # 写入文件
            with open(server_full_path, 'wb+') as f:
                for chunk in uploaded_file.chunks():
                    f.write(chunk)

        data['message'] = "文件夹上传完成,已保留原目录结构"
    return render(request, 'your_upload_template.html', data)

关键说明

  • 不同浏览器对路径的分隔符可能有差异(比如Windows下可能用\),可以用os.path.split()替代字符串拆分来兼容多系统:
    # 替换split('/')的跨平台写法
    dir_path, filename = os.path.split(uploaded_file.name)
    # 再拆分目录层级
    dir_segments = []
    temp_dir = dir_path
    while temp_dir:
        temp_dir, segment = os.path.split(temp_dir)
        if segment:
            dir_segments.insert(0, segment)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:25:19