Django上传文件报错WinError 2:系统找不到指定文件
问题排查与解决
错误根源
你遇到的WinError 2是因为在模型的save方法中,尝试通过os.path.getsize(self.Book_file.path)获取文件大小时,文件还没有被Django保存到磁盘,此时self.Book_file.path指向的路径并不存在,因此触发文件找不到错误。
解决方案
方法1:直接使用上传文件对象的size属性(推荐)
上传的FileField对象本身自带size属性,无需读取磁盘文件,直接获取即可:
def save(self, *args, **kwargs): if self.Book_file: # 直接从文件对象获取大小,无需访问磁盘路径 self.file_size = self.Book_file.size super().save(*args, **kwargs)
方法2:先保存文件再获取大小(需避免循环)
如果必须读取磁盘文件,需要先调用父类的save方法保存文件,再获取大小后再次保存,同时添加标记避免无限循环:
def save(self, *args, **kwargs): # 检查是否是新建对象(避免循环调用) if self.pk is None and self.Book_file: # 先保存文件到磁盘 super().save(*args, **kwargs) # 此时文件路径已存在,获取大小 self.file_size = os.path.getsize(self.Book_file.path) # 再次保存更新file_size字段 super().save(*args, **kwargs) else: super().save(*args, **kwargs)
额外问题修正
你的模型中clean_photo方法存在错误:
- 模型类中没有
cleaned_data属性,表单验证逻辑应该放在表单类中,而非模型类。 image_file.cover_page是错误写法,应该检查上传文件的文件名后缀。
修正后的表单类示例(假设你的UploadForm是ModelForm):
# 在forms.py中 from django import forms from .models import BookUploadModel class UploadForm(forms.ModelForm): class Meta: model = BookUploadModel fields = '__all__' def clean_cover_page(self): cover_page = self.cleaned_data.get('cover_page') if not cover_page.name.endswith('.jpg'): raise forms.ValidationError("仅接受.jpg格式的图片") return cover_page
内容的提问来源于stack exchange,提问作者Taddele Petros
相关产品推荐
相关产品推荐

