下载二进制文件数据

时间:2019-05-22 06:36:47

标签: django django-models django-templates

如何使用模板下载BinaryField数据/文件。就像我们对FileField所做的一样。

<td><a href={{certificate.bytes.url}} download></a>

我将下面的所有url.py和view.py文件过去,请看一下。这可能会提取我的代码。并请帮我解决这个问题,我是Django的新手。 ................................................... ................................................... ................................................... ......

  

url.py

from django.conf.urls.static import static
from django.conf.urls import url
from django.views.defaults import page_not_found
urlpatterns=[
    path('',views.index, name = 'index'),
    url(r'^list/$', views.list, name='list'),
    url(r'^list/create$', views.certificate_create, name='certificate_create'),
    url(r'^list/(?P<id>\d+)/update$', views.certificate_update, name='certificate_update'),
    url(r'^list/(?P<id>\d+)/delete$', views.certificate_delete, name='certificate_delete'),
    path('download',views.download, name = 'download'),


]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

1 个答案:

答案 0 :(得分:1)

因此,我们需要包含BinaryField的Django模型。

models.py

class Person(models.Model):
    name = models.CharField(max_length=55)
    surname = models.CharField(max_length=55)
    image = models.BinaryField()

    class Meta:
        db_table = 'person'

urls.py

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index, name='index'),
    path('download/<int:pk>/', views.download, name='download'),
]

views.py

import io
from django.shortcuts import render
from django.http import FileResponse
from .models import Person

def index(request):
    # there are listed all models.
    persons = Person.objects.all()
    return render(request, 'index.html', {'persons': persons})

def download(request, pk):
    # this url is for download
    try:
        obj = Person.objects.get(pk=pk)
    except Person.DoesNotExist as exc:
        return JsonResponse({'status_message': 'No Resource Found'})
    get_binary = obj.image
    if get_binary is None:
        return JsonResponse({'status_message': 'Resource does not contian image'})
    if isinstance(get_binary, memoryview):
        binary_io = io.BytesIO(get_binary.tobytes())
    else:
        binary_io = io.BytesIO(get_binary)
    response = FileResponse(binary_io)
    response['Content-Type'] = 'application/x-binary'
    response['Content-Disposition'] = 'attachment; filename="{}.png"'.format(pk) # You can set custom filename, which will be visible for clients.
    return response

index.html

{% for person in persons %}
    <a href="{% url 'download' pk=person.pk %}">{{ person.name }}</a><br />
{% endfor %}

这是从服务器发送二进制文件并下载的解决方案。显示所有组件。祝你好运!