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

