zoukankan      html  css  js  c++  java
  • python

    一。 settings.py

    MEDIA_URL = "/qir/"  # 设置获取文件时的访问根路径
    
    MEDIA_ROOT = os.path.join(BASE_DIR, "FileRoot")     # 设置文件存储在项目的根路径(MEDIA_ROOT 是固定值,不可更改)

    二。 models.py

    class MyFiles(models.Model):
        my_files_path = PathAndRename("my_files")    # 该表的文件存储路径
    file = models.FileField(verbose_name="文件", null=True)

    三。 自定义一个创建表文件夹的类

    from django.utils.deconstruct import deconstructible
    from django.utils import timezone
    from django.conf import settings
    
    import os
    
    
    @deconstructible
    class PathAndRename(object):
    
        def __init__(self, sub_path):
            self.path = sub_path    # 要创建的文件夹名称
    
            self.full_path = "%s/%s" % (settings.MEDIA_ROOT, sub_path)  # 拼接 settings 中设置的根目录
            if not os.path.exists(self.full_path):  # 拼接的路径是否被创建
                os.makedirs(self.full_path)
    
        def __call__(self, instance, filename):
            ext = filename.split('.')[-1]
            t = timezone.now().strftime('%Y%m%d%H%M%S%f')
    
            if instance.pk:
                filename = '{}-{}.{}'.format(instance.pk, t, ext)
            else:
                filename = '{}.{}'.format(t, ext)
            return os.path.join(self.path , filename)

    四。 自定义一个保存文件的方法。

    def save_image(files, path, user=None):
        if user:    # 是否使用用户id作为文件存储路径
            file_name = "%s/%s" % (path, user.id)   
            if not os.path.exists(settings.MEDIA_ROOT+"/"+file_name):   # 没有该路径则创建
                os.makedirs(settings.MEDIA_ROOT+"/"+file_name)
            file_name = file_name+"/%s.%s" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"), files.name.split(".")[-1])
        else:
            file_name = "%s/%s.%s" % (path, datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"), files.name.split(".")[-1])
        full_name = "%s/%s" % (settings.MEDIA_ROOT, file_name)
        with open(full_name, "wb+") as f:   # 将文件存储到项目中
            for chunk in files.chunks():
                f.write(chunk)
        return file_name, full_name

    五。 views.py ( 获取文件并存储 )

    class FilesViews(APIView):
        def post(request, *args, **kwargs):
            file = request.FILES.get('file', None)
            file_name, full_name = save_image(file, MyFiles.my_files_path.path, request.user)
            MyFiles.objects.create(file=file_name)
            ...

    六。 获取文件路径并返回前端。

    class FilesViews(APIView):
        def get(request, *args, **kwargs):
            file_list = Myfiles.objects.all()    # 获取所有文件
            file_path_list = []
            for file_obj in file_list:    # 获取每个文件的存储路径
                file_path_list.append(file_obj.file.path)
            ...
                    
  • 相关阅读:
    2019 | 开启新的堕落生活
    2018博客之星评选,我非常需要您宝贵的一票!♪(・ω・)ノ
    前端开发 2018 回顾
    全栈设计模式套餐MVVM, RESTful, MVC的历史探索
    停止学习框架
    那些被浏览器阻止的模拟事件...
    Just Cause系列游戏品鉴
    GPU硬件加速原理 /转
    快速上手最棒的网格框架ag-Grid
    用户数据验证的正确姿势之assert
  • 原文地址:https://www.cnblogs.com/chaoqi/p/11920767.html
Copyright © 2011-2022 走看看