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