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

Django视图中获取上传文件遇FileNotFoundError的解决方法

Django上传文件读取FileNotFoundError解决方法

问题根源

你遇到的问题核心是:未保存Upload实例时,上传的文件还没被Django写入到本地磁盘的指定路径。

  • 调用upload.file.path时,这个路径对应的物理文件实际上还不存在(Django要等你调用save()后才会把临时/内存中的文件转存到MEDIA_ROOT目录);
  • 而upload.file.url是Web访问用的URL路径,不是本地文件系统的真实路径,docx2txt这类工具根本无法识别。

两种解决思路

思路1:先保存实例,再读取文件路径

先把Upload实例保存到数据库,此时Django会自动把上传的文件写入到MEDIA_ROOT对应的路径,之后再调用upload.file.path就没问题了。
示例代码:

# 原错误代码(未保存就调用path)
upload = Upload(file=f)
ScanDocument(upload.file.path)  # 触发FileNotFoundError

# 修改后代码
upload = Upload(file=f)
upload.save()  # 先保存实例,文件被写入磁盘
ScanDocument(upload.file.path)  # 此时路径有效

注意:如果后续ScanDocument处理失败,记得要删除已保存的Upload实例和对应的文件,避免垃圾文件残留。

思路2:直接处理内存中的文件(无需提前保存)

Django的上传文件对象(InMemoryUploadedFile或TemporaryUploadedFile)本身就是类文件对象,docx2txt支持直接传入类文件对象,不需要本地路径。直接把upload.file传给ScanDocument即可,这样不用提前保存实例,效率更高。
示例代码:

upload = Upload(file=f)
# 直接传入文件对象,而非路径
ScanDocument(upload.file)

# 对应的ScanDocument函数需要调整接收参数,比如:
def ScanDocument(file_obj):
    # 用docx2txt直接处理文件对象
    text = docx2txt.process(file_obj)
    # 后续逻辑...

这种方式更推荐,因为跳过了文件写入磁盘的步骤,既避免了路径问题,也减少了IO操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:40:30