From b78c21359dced559f34522a697dae7e1235268b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Fri, 21 Apr 2023 22:51:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?= =?UTF-8?q?=E9=99=84=E4=BB=B6=E7=AE=A1=E7=90=86=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/application/settings.py | 1 + backend/dvadmin/system/models.py | 6 ++- backend/dvadmin/system/views/file_list.py | 46 +++++++++++++++++------ 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/backend/application/settings.py b/backend/application/settings.py index 54a7d25..23b7398 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -408,6 +408,7 @@ PLUGINS_URL_PATTERNS = [] # from dvadmin_uniapp.settings import * # UniApp后端 # from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_tenants.settings import * # 租户管理 +from dvadmin_cloud_storage.settings import * # 云存储 # ... # ********** 一键导入插件配置结束 ********** diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 51056be..8cac84c 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -1,5 +1,6 @@ import hashlib import os +from pathlib import PurePath, PureWindowsPath, PurePosixPath from django.contrib.auth.models import AbstractUser from django.db import models @@ -296,7 +297,7 @@ class OperationLog(CoreModel): def media_file_name(instance, filename): h = instance.md5sum basename, ext = os.path.splitext(filename) - return os.path.join("files", h[0:1], h[1:2], h + ext.lower()) + return PurePosixPath("files", h[:1], h[1:2], h + ext.lower()) class FileList(CoreModel): @@ -317,7 +318,8 @@ class FileList(CoreModel): if not self.size: self.size = self.url.size if not self.file_url: - self.file_url = 'media/' + str(self.url) + url = media_file_name(self,self.name) + self.file_url = f'media/{url}' super(FileList, self).save(*args, **kwargs) class Meta: diff --git a/backend/dvadmin/system/views/file_list.py b/backend/dvadmin/system/views/file_list.py index 4b815ed..5d79de8 100644 --- a/backend/dvadmin/system/views/file_list.py +++ b/backend/dvadmin/system/views/file_list.py @@ -1,7 +1,9 @@ +import hashlib import mimetypes from rest_framework import serializers +from application import dispatch from dvadmin.system.models import FileList from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -12,25 +14,45 @@ class FileSerializer(CustomModelSerializer): def get_url(self, instance): # return 'media/' + str(instance.url) - return instance.file_url or 'media/' + str(instance.url) + return instance.file_url or (f'media/{str(instance.url)}') class Meta: model = FileList fields = "__all__" def create(self, validated_data): + file_engine = dispatch.get_system_config_values("fileStorageConfig.file_engine") + file_backup = dispatch.get_system_config_values("fileStorageConfig.file_backup") + file = self.initial_data.get('file') + file_size = file.size validated_data['name'] = str(self.initial_data.get('file')) - # 1. 是否需要备份到本地服务器 - # 2. 需要备份就把 validated_data['url'] 赋值 - validated_data['url'] = self.initial_data.get('file') - # 3. 上传到云对象存储 - # 4. 如果不需要备份,需要把 - # validated_data['size'] - # validated_data['file_url'] - # validated_data['md5'] - # validated_data['engine'] - # 5. 获取一下媒体类型 mime_type 进行保存 - validated_data['mime_type'] = mimetypes.guess_type(self.initial_data.get('file'))[0] + validated_data['size'] = file_size + validated_data['md5sum'] = hashlib.md5().hexdigest() + validated_data['engine'] = file_engine + validated_data['mime_type'] = mimetypes.guess_type(str(file))[0] + if file_backup: + validated_data['url'] = file + if file_engine =='oss': + from dvadmin_cloud_storage.views.aliyun import ali_oss_upload + file_path = ali_oss_upload(file) + if file_path: + validated_data['file_url'] = file_path + else: + raise ValueError("上传失败") + elif file_engine == 'cos': + from dvadmin_cloud_storage.views.tencent import tencent_cos_upload + file_path = tencent_cos_upload(file) + if file_path: + validated_data['file_url'] = file_path + else: + raise ValueError("上传失败") + else: + validated_data['url'] = file + # 审计字段 + request_user = self.request.user + validated_data['dept_belong_id'] = request_user.dept.id + validated_data['creator'] = request_user.id + validated_data['modifier'] = request_user.id return super().create(validated_data)