如何在django中以blob形式存储在mysql数据库中显示pdf?

时间:2018-03-26 09:30:30

标签: javascript python mysql django

在我的Web应用程序中,用户可以上传pdf文件,并将其存储在mysql数据库本身中。使用以下代码将文件存储在数据库中。 注意:由于安全相关问题,文件保留在数据库中。

    data=request.FILES['file'].read()
    fcursor = db.cursor()
    fcursor.execute("INSERT INTO REPORTS(DOC,id) VALUES(%s,%s)",(data,id))
    db.commit()
    fcursor.close()
    db.close()

用户可以查看此pdf。现在我借助临时文件将pdf传输到模板。

c = db.cursor()
c.execute("SELECT DOC FROM REPORTS WHERE id=%s",(id,))
file = c.fetchone()[0]
c.close()

f=tempfile.NamedTemporaryFile(dir='/tmp/',suffix='.pdf')
f.write(filename)
f.seek(0)
response = HttpResponse(f, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="report.pdf"'
return response

但实际上,我想直接从数据库中显示pdf,而不使用临时文件。

2 个答案:

答案 0 :(得分:2)

是的,我得到了答案!我不需要临时文件。当我通过响应传递从数据库读取的数据时,它工作。我误解了它,在我们有一个存储文件之前它不会工作。但现在我明确了,我们必须通过响应传递二进制数据。由于数据库保存了pdf的二进制形式,因此从数据库和临时文件读取的数据都是相同的。

c = db.cursor()
c.execute("SELECT DOC FROM REPORTS WHERE id=%s",(id,))
file = c.fetchone()[0]
c.close()

response = HttpResponse(file, content_type='application/pdf')
response['Content-Disposition'] = 'inline; filename="report.pdf"'
return response

答案 1 :(得分:0)

我真的希望你有足够的理由将.pdf文件存储在数据库中。更好的做法是将上传的文档或图像存储在文件系统中,并将其文件路径或URL保存到数据库中的文件中。 您的问题与this one类似。问题可能在于您从数据库中读取pdf文件的方式。要直接从数据库显示pdf,您可以尝试使用converted_file = open(file_from_db,"rb")函数将blob文件读取为二进制文件。然后,您可以执行此操作: response = HttpResponse(converted_file, content_type='application/pdf') response['Content-Disposition'] = 'inline; filename="report.pdf"' return response