更改文件的定向输出路径
Directing Output Paths of Altered Files
如何将输出文件的目标指向我的数据库?
我的 models.py 结构如下:
class Model(models.Model):
char = models.CharField(max_length=50, null=False, blank=False)
file = models.FileField(upload_to=upload_location, null=True, blank=True)
我让用户输入 'char' 的值,然后将 'char' 的值打印到文件中。成功打印到文件的过程正在运行,但是,文件正在输出到我的源目录。
我的目标是将输出文件 'pdf01.pdf' 输出到我的数据库并表示为 'file' 以便管理员可以读取它。
Dango 文档中的大部分信息都集中在指导用户直接导入的对象的路径上,而不是在内部创建的文件上。我一直在阅读这些文档:
我看到它建议写入缓冲区,而不是文件,然后将缓冲区内容保存到我的数据库中,但是我无法在网上找到很多与我的情况相关的示例。
也许我对缓冲区和 BytesIO 的了解存在相关差距?这是我一直用来更改 pdf 的功能,我一直在使用 BytesIO 在整个过程中临时存储文件,但一直无法弄清楚如何使用它来将输出定向到特定的任何地方。
can = canvas.Canvas(BytesIO(), pagesize=letter)
can.drawString(10, 10, char)
can.save()
BytesIO().seek(0)
text_pdf = PdfFileReader(BytesIO())
base_file = PdfFileReader(open("media/01.pdf", "rb"))
page = base_file.getPage(0)
page.mergePage(text_pdf.getPage(0))
PdfFileWriter().addPage(page)
PdfFileWriter().write(open("pdf01.pdf", "wb")
FileField
不直接在数据库中存储文件。文件上传到文件系统上由 upload_to
参数确定的位置。只有一些元数据存储在数据库中,包括文件在文件系统中的路径。
如果您想要数据库中的文件内容,您可以创建一个新的 File
模型,其中包括用于存储数据的 BinaryField
和用于存储数据的 CharField
存储可以从中获取文件的 URL。要将 PdfFileWriter 的数据提供给 Django 的二进制字段,也许最合适的是使用 BytesIO.
我发现这个解决方法可以将文件定向到所需位置(在本例中是我的 media_cdn 文件夹,并将其输出给管理员。)
我设置了一个管理操作来执行输出文件的功能,这样管理员就可以访问 HTTP 响应和 media_cdn 存储形式的输出版本。
希望这对遇到同样问题的人有所帮助。
#admin.py
class edit_and_output():
def output:
author = Account.email
#alter file . . .
with open('media_cdn/account/{0}.pdf'.format(author), 'wb') as out_file:
output.write(out_file)
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment;filename="{0}.pdf"'.format(author)
output.write(response)
如何将输出文件的目标指向我的数据库?
我的 models.py 结构如下:
class Model(models.Model):
char = models.CharField(max_length=50, null=False, blank=False)
file = models.FileField(upload_to=upload_location, null=True, blank=True)
我让用户输入 'char' 的值,然后将 'char' 的值打印到文件中。成功打印到文件的过程正在运行,但是,文件正在输出到我的源目录。
我的目标是将输出文件 'pdf01.pdf' 输出到我的数据库并表示为 'file' 以便管理员可以读取它。
Dango 文档中的大部分信息都集中在指导用户直接导入的对象的路径上,而不是在内部创建的文件上。我一直在阅读这些文档:
我看到它建议写入缓冲区,而不是文件,然后将缓冲区内容保存到我的数据库中,但是我无法在网上找到很多与我的情况相关的示例。
也许我对缓冲区和 BytesIO 的了解存在相关差距?这是我一直用来更改 pdf 的功能,我一直在使用 BytesIO 在整个过程中临时存储文件,但一直无法弄清楚如何使用它来将输出定向到特定的任何地方。
can = canvas.Canvas(BytesIO(), pagesize=letter)
can.drawString(10, 10, char)
can.save()
BytesIO().seek(0)
text_pdf = PdfFileReader(BytesIO())
base_file = PdfFileReader(open("media/01.pdf", "rb"))
page = base_file.getPage(0)
page.mergePage(text_pdf.getPage(0))
PdfFileWriter().addPage(page)
PdfFileWriter().write(open("pdf01.pdf", "wb")
FileField
不直接在数据库中存储文件。文件上传到文件系统上由 upload_to
参数确定的位置。只有一些元数据存储在数据库中,包括文件在文件系统中的路径。
如果您想要数据库中的文件内容,您可以创建一个新的 File
模型,其中包括用于存储数据的 BinaryField
和用于存储数据的 CharField
存储可以从中获取文件的 URL。要将 PdfFileWriter 的数据提供给 Django 的二进制字段,也许最合适的是使用 BytesIO.
我发现这个解决方法可以将文件定向到所需位置(在本例中是我的 media_cdn 文件夹,并将其输出给管理员。)
我设置了一个管理操作来执行输出文件的功能,这样管理员就可以访问 HTTP 响应和 media_cdn 存储形式的输出版本。
希望这对遇到同样问题的人有所帮助。
#admin.py
class edit_and_output():
def output:
author = Account.email
#alter file . . .
with open('media_cdn/account/{0}.pdf'.format(author), 'wb') as out_file:
output.write(out_file)
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment;filename="{0}.pdf"'.format(author)
output.write(response)