我想创建一个管理操作来下载用户pdf文件 用户文件将上载到媒体目录中 什么和管理员应该能够下载任何文件 我尝试使用pdfkit让他下载文件,但我不能
> import pdfkit
>
> def downloadCV(self, request, queryset):
> projectUrl = str(queryset[0].cv)+''
> pdf = pdfkit.from_url(projectUrl, False)
> response = HttpResponse(pdf,content_type='application/pdf')
> response['Content-Disposition'] = 'attachment; filename="user_cv.pdf"'
所以我的问题是 让管理员下载pdf文件的最佳方法是什么
我试过这种方式
def downloadCV(self, request, queryset):
for x in queryset:
projectUrl = str(x.cv)+''
if projectUrl:
with open(projectUrl, 'r') as pdf:
response = HttpResponse(pdf,content_type='application/pdf')
response['ContentDisposition']='attachment;filename="user_cv.pdf"'
return response
pdf.closed
但是我只能一次下载一个文件,有没有一次下载多个pdfs?
答案 0 :(得分:1)
请求只能提供一个响应。所以我认为你有两个选择
选项1,您可以发出多个请求。基本上类似于您现在拥有的代码,但是针对一个文件但使用某种javascript代码,这些代码将在新选项卡/窗口中对单个文件运行操作。所以说你检查了管理员中的3个文件并运行了打开3个标签所需的操作,每个标签都有自己的文件,为你提供pdf文件。
选项2,压缩文件并返回一个zip文件。这对我来说似乎更容易。这是一个我没有经过测试但你明白了的例子。从查询集中收集文件,然后将它们推送到zipfile中,然后提供zip文件。
import pdfkit
import tempfile
import zipfile
def downloadCV(self, request, queryset):
with tempfile.SpooledTemporaryFile() as tmp:
with zipfile.ZipFile(tmp, 'w', zipfile.ZIP_DEFLATED) as archive:
for index, item in enumerate(queryset):
projectUrl = str(item.cv) + ''
fileNameInZip = '%s.zip' % index
pdf = pdfkit.from_url(projectUrl, False)
archive.writestr(fileNameInZip, pdf)
tmp.seek(0)
response = HttpResponse(tmp.read(), mimetype='application/x-zip-compressed')
response['Content-Disposition'] = 'attachment; filename="pdfs.zip"'
return response