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

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

一、文件上传

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

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

models.py

1
2
3
4
5
6
7
8
9
10
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   一先生94  阅读(899)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示