Django笔记:文件上传
Django中上传的文件,除了使用普通的方式接收外,还可以通过ORM模型来自动接收。
前端文件提交
下面是一种较为通用的文件提交方式,这种方式需要注意,form
标签的enctype
属性值必须为multipart/form-data
,用于文件提交的input
标签的type
属性值也必须是file
,当然,请求method
也需要是post
。
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit" name="提交">
</form>
普通方式上传文件
普通的文件接收方式就是将request.FILES
中的文件对象获取出来再手动写入一个新的文件即可。
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
# 新建一个视图
class IndexView(View):
# 返回文件上传的界面
def get(sel, request):
return render(request, "index.html")
# 获取上传的文件,并保存到新的文件中
def post(self, request):
myfile = request.FILES.get("myfile")
with open("somefile.txt", "wb") as fp:
for chunk in myfile.chunks():
fp.write(chunk)
return HttpResponse("success!")
使用ORM模型自动接收
这种方式需要在ORM模型中定义一个models.FileField
字段,并指定upload_to
参数,此参数为文件存放的目录路径,是一个相对于项目根目录的相对路径。upload_to
参数除了直接指定路径名外,还可以使用当前日期来指定路径,如%Y/%m/%d/
表示根据当前的年月日信息新建三层目录,上传的文件就放在此目录下(字符串中的斜杠表示路径分隔符)。指定的目录不存在的话,会自动新建。
注1:如果在settings.py
中配置了MEDIA_ROOT
,则默认会将上传的文件放在此目录下,如果同时也指定了uplodad_to
参数,则会在此目录下再新建对应目录来存放文件。
注2:如果要上传图片,可以使用models.ImageField
字段,用法和models.FileField
是一样的。使用这个字段时,如果提示安装Pillow
库,则按提示安装即可,Django中处理图片需要用到这个库。安装方法:pip install pillow
。
from django.db import models
# 随意新建一个ORM模型
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
file = models.FileField(upload_to="upload_files")
# 可以按照日期来新建目录,注意斜杠表示目录分隔,%Y/%m/%d/会新建三层目录
# file = models.FileField(upload_to="%Y/%m/%d/")
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
from .models import Article
class IndexView(View):
def get(self, request):
return render(request, "index.html")
def post(self, request):
title = request.POST.get("title")
content = request.POST.get("content")
# 获取文件并使用ORM模型来进行自动保存
file = request.FILES.get("myfile")
# 除了会将提交信息保存到数据库中,还会自动将文件保存到upload_to参数指定的目录下
Article.objects.create(title=title, content=content, file=file)
return HttpResponse("success!")