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来下载需要的一些格式。