You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:48