更改文件的定向输出路径

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 文档中的大部分信息都集中在指导用户直接导入的对象的路径上,而不是在内部创建的文件上。我一直在阅读这些文档:

Models-Fields

Models

File response objects

Outputting PDFs

我看到它建议写入缓冲区,而不是文件,然后将缓冲区内容保存到我的数据库中,但是我无法在网上找到很多与我的情况相关的示例。

也许我对缓冲区和 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)