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

