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
相关产品推荐
相关产品推荐

