如何将内存生成的PDF通过File包装器保存到Django的FileField?
Django内存PDF保存到FileField问题
我正尝试在应用中实现一项功能:生成内存PDF文件并将其保存到我的Document模型的FileField中。
生成内存PDF的流程
from io import BytesIO from PyPDF2 import PdfWriter in_memory_file = BytesIO() writer = PdfWriter() writer.add_blank_page(height=200, width=200) writer.write(in_memory_file) # `writer`的内容已保存到`io`文件中
本地保存正常的代码
with open('new_local_file.pdf', 'wb') as local_file: local_file.write(in_memory_file.getbuffer())
上述代码在终端中运行正常,但由于我的Django应用无法创建本地副本,我尝试通过以下方式保存文件,但执行后Django Admin中未创建任何文件:
from django.core.files import File obj = Document.objects.create(file_result=File(in_memory_file.getbuffer()))
问题原因及解决方案
问题出在两个核心点:
in_memory_file.getbuffer()返回的是字节缓冲区,并非Django File类要求的类文件对象- 写完PDF到BytesIO后,文件指针停在内容末尾,直接读取会获取空内容
正确的实现代码如下:
from io import BytesIO from PyPDF2 import PdfWriter from django.core.files import File from .models import Document in_memory_file = BytesIO() writer = PdfWriter() writer.add_blank_page(height=200, width=200) writer.write(in_memory_file) # 将文件指针移到文件开头,确保能读取到完整内容 in_memory_file.seek(0) # 用Django的File包装BytesIO对象,必须指定文件名(FileField依赖文件名识别格式) obj = Document.objects.create( file_result=File(in_memory_file, name="generated_pdf.pdf") )
说明:
seek(0)是必要操作,让指针回到文件起始位置,否则Django读取不到PDF内容- 给File类传入
name参数,确保FileField能正确存储并识别文件类型,避免出现无后缀或无法预览的问题
内容的提问来源于stack exchange,提问作者Vivek K. Singh
相关产品推荐
相关产品推荐

