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

Django中如何获取FileField字段上传文件的原始文件名

Django 获取 FileField 上传文件原始文件名的方案

核心实现方法

你需要的能力Django原生已支持,不需要额外自定义函数。如果你没有修改文件上传时的存储名称,直接访问模型实例对应FileField字段的name属性即可拿到原始文件名,调用形式和你预期的基本一致:

# obj 为 extract 模型的实例对象
name = obj.doc.name

如果之后你有修改存储文件名、但仍需要保留原始文件名的需求,可以在模型中新增字段专门存储原始文件名,在首次保存实例时赋值即可。


你提供的示例代码修正说明

你的示例代码存在多处语法和逻辑错误,这里给出可运行的修正版本:

import os
from django.db import models
import PyPDF2

# Python 类名约定使用大驼峰命名
class Extract(models.Model):
    doc = models.FileField(upload_to='files/')
    # 可选:如果需要持久化存储原始文件名,新增此字段
    origin_filename = models.CharField(max_length=256, editable=False, blank=True)
    text = models.TextField(editable=False, blank=True)

    def save(self, *args, **kwargs):
        # 仅首次保存实例时执行PDF提取逻辑
        if not self.pk:
            # 存储原始文件名
            self.origin_filename = os.path.basename(self.doc.name)
            # 直接通过doc.path获取文件绝对路径,不要写死本地路径
            with open(self.doc.path, 'rb') as pdf_file:
                reader = PyPDF2.PdfFileReader(pdf_file)
                page1 = reader.getPage(0)
                self.text = page1.extractText()
        super().save(*args, **kwargs)

错误点说明:

  • upload_to参数赋值误用了双等号==,且对应的回调函数只能返回字符串格式的文件相对路径,不能返回元组
  • 不能在模型字段定义时直接调用ex(fname)作为默认值,模型初始化阶段还不存在上传的文件对象,会直接报错,依赖实例字段的逻辑需要放在save方法中执行
  • 读取PDF文件需要使用二进制读模式rb,否则会出现编码报错
  • 不要写死本地文件绝对路径,通过self.doc.path可以直接获取Django存储文件的真实绝对路径,适配不同部署环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:06:04