如何在Django中实现文件可下载功能?附上传模型与视图代码
实现Django平台的文件下载功能指南
嘿,看来你已经搞定了Django的文件上传部分,那实现下载功能其实很简单,我来一步步给你讲清楚:
1. 编写下载视图函数
Django内置了FileResponse专门用来处理文件下载场景,我们可以基于你现有的UploadAssignment模型来写对应的视图:
from django.http import FileResponse, Http404, HttpResponseForbidden from django.shortcuts import get_object_or_404 from .models import UploadAssignment import os def download_assignment(request, pk): # 获取对应的文件上传记录 upload_record = get_object_or_404(UploadAssignment, pk=pk) # 可选:添加权限控制(比如仅上传学生或老师可下载) is_student = request.user == upload_record.student.user is_teacher = request.user.is_staff # 假设老师是staff用户 if not is_student and not is_teacher: return HttpResponseForbidden("你没有权限下载该文件") # 获取文件的本地路径 file_path = upload_record.doc.path # 检查文件是否存在,避免报错 if not os.path.exists(file_path): raise Http404("目标文件不存在") # 构造下载响应 response = FileResponse(open(file_path, 'rb')) # 设置响应头,强制浏览器触发下载行为(而非直接打开) file_name = os.path.basename(file_path) response['Content-Disposition'] = f'attachment; filename="{file_name}"' return response
2. 配置URL路由
在你的应用urls.py中添加下载对应的路由,和上传路由放在一起:
from django.urls import path from .views import upload_assignment, download_assignment urlpatterns = [ # 你已有的上传路由 path('assignment/upload/<int:pk>/', upload_assignment, name='upload_assignment'), # 新增的下载路由 path('assignment/download/<int:pk>/', download_assignment, name='download_assignment'), ]
3. 在模板中添加下载链接
假设你有一个展示作业提交列表的页面,在模板里给每个上传记录添加下载按钮:
{% for submission in assignment_submissions %} <div class="submission-item"> <p>提交人:{{ submission.student.user.username }}</p> <p>提交时间:{{ submission.created_at }}</p> <!-- 如果你模型里有时间字段的话 --> <a href="{% url 'download_assignment' submission.pk %}" class="btn btn-success">下载作业文件</a> </div> {% endfor %}
这里的assignment_submissions是你在视图中传递给模板的UploadAssignment查询集,比如UploadAssignment.objects.filter(assignment=assign)。
几个关键注意点
- 权限控制:上面的视图里已经加了基础的权限判断,你可以根据自己的业务逻辑调整(比如只有对应课程的老师才能下载)。
- 文件安全:通过
get_object_or_404获取上传记录,再从记录中取文件路径,避免了用户构造URL访问任意文件的风险。 - 大文件优化:如果需要处理超大文件,可以把
FileResponse换成StreamingHttpResponse,避免一次性加载文件到内存。
内容的提问来源于stack exchange,提问作者mbdow
相关产品推荐
相关产品推荐

