python - django 设置自定义文件保存路径

Posted Q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python - django 设置自定义文件保存路径相关的知识,希望对你有一定的参考价值。

一。 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)
        ...
                

 

 

以上是关于python - django 设置自定义文件保存路径的主要内容,如果未能解决你的问题,请参考以下文章

Django settings.py 的media路径设置

Django框架文件保存的流程(以及自定义)

django 在模型自定义保存中访问上传的文件,最佳实践?

通过django中间件和python魔法方法实现自定义session(通过文件存储session)

Django(十九)文件上传:图片上传(后台上传自定义上传)

如何保存python IDLE的自定义首选项?