Django中获取上传docx文件实际路径解决python-docx读取报错
问题根因
传给python-docx的文件路径错误,你传的是Web访问路径,不是服务器本地磁盘的真实存储路径,库无法读取到对应文件才触发PackageNotFoundError。
具体错误点
- 你在视图中调用
new_doc.file1.url这类写法取到的是Web访问前缀路径,也就是报错里显示的/media/documents/word/xxx.docx,这个路径是给浏览器拼访问地址用的,指向系统根目录下的media文件夹,不是你项目里存上传文件的media目录。 - 你在settings中配置的
MEDIA_ROOT = os.path.join(BASE_DIR,'media')才是上传文件的真实磁盘根目录,文件实际存放在你的项目文件夹/media/documents/word/路径下,和你传给库的路径完全不匹配。 - 现有合并逻辑里直接执行
doc.save('ss merged.docx')会把生成的文件存在Django运行的工作目录,不会存到MEDIA_ROOT下,后续下载链接会直接404。 - settings.py存在笔误:
TATIC_URL = 'static/'缺少首字母S,会导致静态文件加载异常。
修复方案
1. 替换传参的属性,用磁盘绝对路径
把home视图中取文件路径的部分从.url换成.path,这个属性会自动拼接MEDIA_ROOT返回真实磁盘路径,直接传给python-docx即可正常读取:
# 注释掉原来错误的取url写法 # file1_name = new_doc.file1.url # file2_name = new_doc.file2.url # file3_name = new_doc.file3.url # 替换为取本地磁盘路径 file1_path = new_doc.file1.path file2_path = new_doc.file2.path file3_path = new_doc.file3.path number = new_doc.pk SS_Merge(response, number, file1_path, file2_path, file3_path)
2. 修正合并文件的存储逻辑
不要把合并后的文件存在工作目录,要存到MEDIA_ROOT下的对应上传目录,同时关联到模型的file_processed字段,保证下载链接能正常访问:
import os from django.conf import settings def SS_Merge(response, n, f1,f2,f3): file = Mydocument.objects.get(id=n) doc1 = dc.Document(f1) doc2 = dc.Document(f2) doc3 = dc.Document(f3) # 保留你原有的表格合并逻辑 # ......(此处省略你原来写的合并处理代码) # 拼接合并后文件的存储路径 merged_file_name = f"merged_ss_{n}.docx" merged_full_path = os.path.join(settings.MEDIA_ROOT, 'documents/word', merged_file_name) # 替换成你最终合并完成的doc对象调用save merged_doc.save(merged_full_path) # 把生成的文件关联到数据库记录 file.file_processed = f"documents/word/{merged_file_name}" file.save() return render(response, 'download.html', {'file': file})
3. 修正settings.py笔误
把写错的TATIC_URL = 'static/'改成STATIC_URL = 'static/',避免静态资源加载失败。
验证方法
改完后可以打印传给dc.Document()的路径,确认路径是从你项目存放目录开始的完整路径(比如/home/xxx/yourproject/media/documents/word/xxx.docx),而非从系统根目录开始的/media/xxx,库就能正常读取文件了。
内容的提问来源于stack exchange,提问作者bk thapa
相关产品推荐
相关产品推荐

