Django当中如何上传和下载文件?

在web开发中,上传和下载文件都很常见。也有很多方法。本文只讲解通过form表单来进行文件上传。通过FileResponse进行文件下载。

一、文件上传

通过form表单进行文件上传。

首先,通过Django模型类创建数据。

models.py

import os
from django.db import models


def user_directory_path(instance,filename):
    return os.path.join(instance.name,'avatars',filename)

class File(models.Model):
    name = models.CharField(max_length=32, null=True)
    avatar = models.FileField(upload_to=user_directory_path, null=True)
    

前端代码:

1     <div>
2         <form action="" method="post" enctype="multipart/form-data">
3             {% csrf_token %}
4             <input type="file" name="excel">
5             <input type="text" name="user">
6             <input type="submit" value="提交">
7         </form>
8     </div>

后端代码:

def upload_view(request):
  if request.method == "GET":
    try:
      with transaction.atomic() # 为事务
        excel = request.FILES.get('excel')
        name = excel.name
        models.File.objects.create(name=name,avatar=excel)
        return HttpResponse('上传成功!')
    except Exception as e:
      print(e)
      return render(request,'submit.html')
  return render(request,'submit.html')

当然在settings中需要进行配置,需要加入

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

用于上传文件的保存。在模型类File中存储的是一个路径。

 

二、文件下载

通过FileResponse来下载文件。

后端代码:

    def download_view(request,pk):
        file_result = models.File.objects.filter(id=pk).first()
        if file_result:
            file = open(file_result.avatar.path,'rb')
            response = FileResponse(file)
            response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(file_result.name)
            return response
        else:

            return HttpResponse('文件不存在!')

上述注意:1.如何去取到在模型类FIIL中文件的绝对路径呢?其实在Django中的FileField做了很长的路径拼接,不需要自己去拼接了。直接就是

对象.avatar.path  (avatar是存放路径的字段) 就可以轻松拿到该文件的绝对路径啦!

2.注意通过FileResponse来下载需要的一些格式。

 

posted on 2022-08-03 21:57  一先生94  阅读(884)  评论(0编辑  收藏  举报

导航