Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python .pdf在存储和下载后会被损坏_Python_Django_Django Storage - Fatal编程技术网

Python .pdf在存储和下载后会被损坏

Python .pdf在存储和下载后会被损坏,python,django,django-storage,Python,Django,Django Storage,我已将.pdf存储在models.FileField中,并可供用户下载。但是当我下载文件时,它被损坏了。有人能告诉我是否正确存储了它,或者给我指明了方向吗?我的设置如下所示: models.py class Barcard(models.Model): name = models.CharField(max_length=30) drinks = models.ManyToManyField(Drink) barcardFile = models.FileField(bl

我已将.pdf存储在
models.FileField
中,并可供用户下载。但是当我下载文件时,它被损坏了。有人能告诉我是否正确存储了它,或者给我指明了方向吗?我的设置如下所示:

models.py

class Barcard(models.Model):
    name = models.CharField(max_length=30)
    drinks = models.ManyToManyField(Drink)
    barcardFile = models.FileField(blank=True, upload_to='barcard') 
    mixingFile = models.FileField(blank=True, upload_to='mixing') 

    def generateFiles(self):
        bashCommand = 'make -C tkweb/apps/drinks/drinkskort/'
        subprocess.call(bashCommand, shell=True)
        barFile = open('tkweb/apps/drinks/drinkskort/bar_drinks.pdf', encoding = "ISO-8859-1")
        mixFile = open('tkweb/apps/drinks/drinkskort/mixing_drinks.pdf', encoding = "ISO-8859-1")
        self.barcardFile.save(self.name+'_barcard',File(barFile))
        self.mixingFile.save(self.name+'_mixing',File(mixFile))
view.py

def barcardGen(request):
    if request.method =='POST':
        card = request.POST.get('barcard')
        card_obj = Barcard.objects.get(id=card)
        barcardName = card_obj.name
        card_obj.generateFiles()
        return HttpResponseRedirect('/drinks/download/'+card)
    else:
        return HttpResponseRedirect('/drinks/')

def download(request, barcard_id):
    if request.method == 'GET':
        barcard = get_object_or_404(Barcard, pk=barcard_id)
        return render(request, 'drinks/download.html', {'barcard':barcard})
    else:
        return HttpResponseRedirect('/drinks/')
模板/饮料/下载.py

{% extends "drinks/base.html" %}
{% block fulltitle %}Drinks{% endblock %}
{% block content %}
<h1>{{ barcard.name }}</h1>
<p> Download barkort her: <a href='{{barcard.barcardFile.url}}'>{{barcard.name}} barkort</a> </p>
<p> Download blandekort her: <a href='{{barcard.mixingFile.url}}'>{{barcard.name}} blandeliste</a></p>
{% endblock %}
{%extends“drinks/base.html”%}
{%block fulltitle%}饮料{%endblock%}
{%block content%}
{{barcard.name}
下载barkort her:

下载blandekort-her:

{%endblock%}
PDF文件是二进制文件。您应该使用二进制模式
rb
读取它们,而不指定文本编码:

barFile = open('tkweb/apps/drinks/drinkskort/bar_drinks.pdf', "rb")
mixFile = open('tkweb/apps/drinks/drinkskort/mixing_drinks.pdf', "rb")

我对Django不太了解,但PDF文件是二进制文件。您确定应该在那里提供
编码
参数吗?您是否尝试使用模式
rb
而不是指定编码<代码>打开('/my/path/to/file.pdf',rb')
谢谢,这解决了问题。那天早些时候,我遇到了一些问题,Django在这些行中给了我一些编码错误,所以我定义了编码。看来那是个坏主意。