Django项目学习之在线文档下载

    技术2026-04-09  6

    当遇到要显示文档的问题,如果文档比较大,每次从服务器上取,就很耗费时间,如何解决这一问题呢? 可以新建一个app,利用爬虫来解决这一问题:

    新建一个模型保存可提供下载的文件的详细信息

    from django.db import models # Create your models here. from theonedjango.utils.model import ModelBase class Doc(ModelBase): file_url = models.URLField(verbose_name="书籍URL") title = models.CharField(max_length=150, verbose_name="标题") docs = models.TextField(verbose_name="书籍介绍") image_url = models.URLField(verbose_name="图片地址", default='') author = models.ForeignKey('users.Users', on_delete=models.SET_NULL, verbose_name='作者', null=True) class Meta: db_table="tb_docs" verbose_name='书籍' verbose_name_plural=verbose_name def __str__(self): return self.title

    使用requests库需要获取需下载文件的详细url地址,而数据库中保存的是文档的绝对路径,需要添加对应host和port

    在setting中添加:

    FILE_URL = "http://127.0.0.1:8000/" # 变量名不唯一

    下面是对应的使用爬虫配合django下载文件的代码:

    from django.http import FileResponse, Http404 from django.shortcuts import render, redirect # Create your views here. from django.utils.encoding import escape_uri_path from django.views import View from . import models import requests from theonedjango.settings.dev import FILE_URL class DownLoadDoc(View): def get(self, request, doc_id): doc_file = models.Doc.objects.only('file_url').filter(is_delete=False, id=doc_id).first() if doc_file: # /media/流畅的Python.pdf doc_url = doc_file.file_url# 获取文件路径 doc_url = FILE_URL + doc_url# 拼接端口和文件路径,提供给爬虫访问 # a = requests.get(doc_url) # res = HttpResponse(a) 这种方式是直接在网页打开 res = FileResponse(requests.get(doc_url))# 这种方式,访问后,是把文件下载下来 ex_name = doc_url.split('.')[-1] # pdf,截取文件后缀名 if not ex_name: raise Http404('文件名异常') else: ex_name = ex_name.lower() # 下面是设置数据返回的类型(前台向后端传输数据的时候,这样指定告诉Django后台该怎么处理传过来的数据, 后台也需要这样返回给前台,告诉前台文件处理格式),这里只列出几种,需要其他的可以在网上找 if ex_name == 'pdf': res['Content-type'] = 'application/pdf' elif ex_name == 'doc': res['Content-type'] = 'application/msowrd' elif ex_name == 'ppt': res['Content-type'] = 'application/powerpoint' else: raise Http404('文件格式不正确') doc_filename = escape_uri_path(doc_url.split('/')[-1])# 这里利用escape_uri_path获取文件名 # attachment 以附件的方式下载(还有其他选择可以自行百度) inline 显示,Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME # 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。 # res["Content-Disposition"] = "attachment; filename*=UTF-8''{}".format(doc_filename) # 响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个"文件下载"的对话框,接下来就是由你来决定"打开"还是"保存"了。 res["Content-Disposition"] = "attachment; filename*=UTF-8''{}".format(doc_filename) return res else: raise Http404('文档不存在')
    Processed: 0.008, SQL: 9