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

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方法存在错误:

  1. 模型类中没有cleaned_data属性,表单验证逻辑应该放在表单类中,而非模型类。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:12:38