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

