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

Django中PDF上传读取报错求助:TemporaryUploadedFile类型错误

解决Django上传PDF时PyPDF2的TypeError问题

这个错误的核心原因很清晰:你传给open()的不是文件路径字符串,而是Django的TemporaryUploadedFile对象。Django处理文件上传时,会把上传的文件包装成TemporaryUploadedFile(或InMemoryUploadedFile,取决于文件大小),它本身就是一个类文件对象,完全不需要再用open()去打开。

正确的处理代码

直接将上传的文件对象传给PdfFileReader即可,不需要额外调用open():

# views.py 示例代码
from PyPDF2 import PdfFileReader
from django.shortcuts import render

def pdf_upload_view(request):
    if request.method == 'POST':
        # 获取上传的文件对象
        uploaded_pdf = request.FILES.get('pdf_file')
        if not uploaded_pdf:
            return render(request, 'index.html', {'error': '请选择要上传的PDF文件'})
        
        # 直接传入文件对象给PdfFileReader
        try:
            pdf_reader = PdfFileReader(uploaded_pdf)
            # 示例:读取第一页文本内容
            if pdf_reader.numPages > 0:
                first_page_content = pdf_reader.getPage(0).extractText()
                return render(request, 'index.html', {'content': first_page_content})
            else:
                return render(request, 'index.html', {'error': '上传的PDF文件为空'})
        except Exception as e:
            return render(request, 'index.html', {'error': f'PDF处理失败:{str(e)}'})
    return render(request, 'index.html')

额外的验证与优化建议

为了避免非PDF文件引发的异常,建议在视图中先做文件类型校验:

  • 检查文件MIME类型:if uploaded_pdf.content_type != 'application/pdf'
  • 或者校验文件名后缀:if not uploaded_pdf.name.lower().endswith('.pdf')

同时要确保前端表单正确配置,否则Django无法接收上传文件:

<!-- index.html 中的表单代码 -->
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="pdf_file" accept=".pdf">
    <button type="submit">上传并读取内容</button>
</form>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:45