Django自动上传文件触发WinError 123路径语法错误如何解决?
问题根源排查与解决方案
报错的核心原因是FileField接收到的文件名包含Windows盘符的绝对路径,最终被拼接到了存储路径的末尾,导致路径不合法。
具体触发原因
你创建File对象时没有手动指定name属性,此时Django会默认使用你打开文件时的绝对路径作为文件的name值。当history_directory_path函数直接使用这个值拼接存储路径时,就会把C:这类盘符信息也带入最终路径,触发你遇到的WinError 123报错。
修复方案
- 方案1:创建File对象时手动指定纯文件名
修改你的上传脚本中创建File对象的代码,手动传入你已经提取好的纯文件名:
# 原来的代码 my_file = File(f) # 修改为 my_file = File(f, name=filename)
这里的filename是你已经通过os.path.basename拿到的不带路径的纯文件名,指定后传给upload_to回调的文件名参数就不会包含盘符和路径信息。
- 方案2:在history_directory_path函数中做兜底处理
不管传入的文件名是否带路径,都先提取纯文件名再拼接路径,示例如下:
def history_directory_path(instance, filename): # 先提取纯文件名,过滤掉路径、盘符信息 pure_filename = os.path.basename(filename) # 再拼接你原来的路径逻辑 return f"documents/history/{pure_filename}/version_{instance.version_num}/{pure_filename}"
额外检查项
你贴出的模型定义中date字段的db_column参数漏了闭合单引号,属于笔误,建议同步修复:
# 原来的代码 date = models.DateTimeField(auto_now_add = True, db_column = 'date) # 修改为 date = models.DateTimeField(auto_now_add = True, db_column = 'date')
内容的提问来源于stack exchange,提问作者brdptr02
相关产品推荐
相关产品推荐

