微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,'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!')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐