实现 Django 下载文件功能需要以下几个步骤:
1. 定义 URL 和视图函数
在 urls.py
中定义 URL,将其映射到相应的视图函数上。如下所示:
from django.urls import path
from myapp.views import download_file
urlpatterns = [
path('download/<str:file_name>/', download_file, name='download_file'),
]
在 views.py
中编写视图函数 download_file
,该函数读取指定的文件并将其发送到客户端:
import os
from django.http import FileResponse
from django.shortcuts import get_object_or_404
def download_file(request, file_name):
# 获取文件路径
file_path = os.path.join(settings.MEDIA_ROOT, file_name)
# 如果文件存在,则读取该文件并发送到客户端
if os.path.exists(file_path):
# 使用 FileResponse 可以确保在读取和发送文件的过程中不会占用太多的内存,
# 以此避免 HTTP 503 错误(服务器繁忙)
file = open(file_path, 'rb')
response = FileResponse(file)
# 设置 Content-Disposition 头部信息,告诉客户端该文件该怎么处理
response['Content-Disposition'] = f'attachment;filename="{os.path.basename(file_path)}"'
return response
# 如果文件不存在,则返回 404 错误
else:
return get_object_or_404(Http404)
以上代码中,get_object_or_404
是 Django 提供的一个快捷方式,用于在数据库中查找特定的对象。如果查询结果为空,则返回 404 错误。
2. 编写 HTML 模板
在 HTML 模板中添加一个用于触发文件下载的链接,如下所示:
<a href="{% url 'download_file' file_name=filename %}">下载文件</a>
在上面的代码中,{% url %}
标签将 URL 名称和参数列表翻译为相应的 URL。这里的 file_name
参数需要在视图函数中声明,用来表示要下载的文件名。
示例说明1:下载图片
为了更直观的演示下载文件功能,这里我们以下载图片为例。首先在项目根目录下创建 media
文件夹,并在其中添加一张图片,并命名为 example.jpg
。然后就可以使用以下代码进行测试:
<!-- 在模板中添加用于触发文件下载的链接 -->
<a href="{% url 'download_file' file_name='example.jpg' %}">下载图片</a>
将上面的代码添加到某个页面中,通过点击该链接就可以下载名为 example.jpg
的图片了。
示例说明2:下载动态生成的文件
有时候,我们需要从代码中动态生成文件并将其供用户下载。这时,可以使用 Python 内置的 io
模块来读取要下载的文件,并将其发送到客户端。具体实现方式如下:
from io import BytesIO
from reportlab.pdfgen import canvas
def download_pdf(request):
buffer = BytesIO()
# 创建 PDF 文档
p = canvas.Canvas(buffer)
p.drawString(100, 100, "Hello world.")
p.showPage()
p.save()
# 将 PDF 文件发送到客户端
buffer.seek(0)
response = FileResponse(buffer, content_type='application/pdf')
response['Content-Disposition'] = 'attachment;filename="example.pdf"'
return response
以上代码中,BytesIO
是一个内存文件对象,可以在内存中保存二进制数据。这里使用该对象保存生成的 PDF 文件,然后将该对象转换为 FileResponse
对象并发送到客户端。
完成上述操作后,就可以在相应的 HTML 模板中添加链接进行测试了:
<!-- 在模板中添加用于触发文件下载的链接 -->
<a href="{% url 'download_pdf' %}">下载 PDF 文件</a>
点击链接即可下载名为 example.pdf
的 PDF 文件。
总结一下,实现 Django 下载文件功能的关键是:
- 定义 URL 和视图函数;
- 在视图函数中读取指定的文件并将其发送到客户端;
- 在 HTML 模板中添加用于触发文件下载的链接。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 实现下载文件功能的示例 - Python技术站