优化代码,增加添加oss存储 校验功能

super_signature
nineven 5 years ago
parent b32a12a597
commit c46bbc6f75
  1. 3
      fir_client/src/components/FirUserProfileStorage.vue
  2. 1
      fir_ser/api/migrations/0007_auto_20200520_1153.py
  3. 10
      fir_ser/api/utils/storage/aliyunApi.py
  4. 5
      fir_ser/api/utils/storage/localApi.py
  5. 11
      fir_ser/api/utils/storage/qiniuApi.py
  6. 30
      fir_ser/api/utils/storage/storage.py
  7. 9
      fir_ser/api/utils/utils.py
  8. 30
      fir_ser/api/views/storage.py

@ -273,9 +273,10 @@
}
this.getstorageinfoFun();
} else {
this.$message.error('操作失败,' + data.msg);
}
}, {"methods": methods, 'data': this.editstorageinfo});
this.getstorageinfoFun();
}, del_storage_info(sinfo) {
this.$confirm('此操作可能会导致程序异常, 是否继续?', '警告', {

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0006_udidsyncdeveloper'),
]

@ -124,3 +124,13 @@ class AliYunOss(object):
def rename_file(self, oldfilename, newfilename):
self.bucket.copy_object(self.bucket_name, oldfilename, newfilename)
return self.del_file(oldfilename)
def upload_file(self, local_file_full_path):
if os.path.isfile(local_file_full_path):
with open(local_file_full_path, 'rb') as fileobj:
# Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。
fileobj.seek(1000, os.SEEK_SET)
# Tell方法用于返回当前位置。
# current = fileobj.tell()
self.bucket.put_object(os.path.basename(local_file_full_path), fileobj)
return True

@ -54,3 +54,8 @@ class LocalStorage(object):
except Exception as e:
logger.error("rename_file file %s to %s failed Exception %s" % (oldfilename, newfilename, e))
return False
def upload_file(self, local_file_full_path):
if os.path.isfile(local_file_full_path):
return True
return False

@ -6,8 +6,9 @@
'''
主要是调用七牛云存储处理七牛云存储的逻辑
'''
from qiniu import Auth
from qiniu import Auth, put_file, etag
from qiniu import BucketManager
import os
class QiNiuOss(object):
@ -54,3 +55,11 @@ class QiNiuOss(object):
bucket = BucketManager(self.qiniu_obj)
ret, info = bucket.move(self.bucket_name, oldfilename, self.bucket_name, newfilename)
return ret
def upload_file(self, local_file_full_path):
if os.path.isfile(local_file_full_path):
filename = os.path.basename(local_file_full_path)
token = self.get_upload_token(filename)
ret, info = put_file(token, filename, local_file_full_path)
if ret['key'] == filename and ret['hash'] == etag(local_file_full_path):
return True

@ -17,9 +17,9 @@ logger = logging.getLogger(__file__)
class Storage(object):
def __init__(self, user):
def __init__(self, user, storage_obj=None):
try:
self.storage = self.get_storage(user)
self.storage = self.get_storage(user, storage_obj)
except Exception as e:
logger.error("get %s storage failed Exception:%s" % (user, e))
self.storage = None
@ -48,13 +48,29 @@ class Storage(object):
filename = filename + '.apk'
else:
filename = filename + '.ipa'
try:
return self.storage.del_file(filename)
except Exception as e:
logger.error("delete file %s failed Exception %s" % (filename, e))
def rename_file(self, oldfilename, newfilename):
if self.storage:
try:
return self.storage.rename_file(oldfilename, newfilename)
except Exception as e:
logger.error("rename %s to %s failed Exception %s" % (oldfilename, newfilename, e))
def upload_file(self, local_file_full_path):
if self.storage:
try:
return self.storage.upload_file(local_file_full_path)
except Exception as e:
logger.error("oss upload %s failed Exception %s" % (local_file_full_path, e))
def get_storage(self, user):
def get_storage(self, user, storage_obj):
if storage_obj:
self.storage_obj = storage_obj
else:
self.storage_obj = user.storage
if self.storage_obj:
auth = self.get_storage_auth(self.storage_obj)
@ -62,7 +78,7 @@ class Storage(object):
base64.b64encode(json.dumps(auth).encode("utf-8")).decode("utf-8")[0:64]])
storage_type = self.storage_obj.storage_type
new_storage_obj = cache.get(storage_key)
if new_storage_obj:
if new_storage_obj and not storage_obj:
return new_storage_obj
else:
if storage_type == 1:
@ -76,12 +92,12 @@ class Storage(object):
cache.set(storage_key, new_storage_obj, 600)
return new_storage_obj
else:
return self.get_default_storage(user)
return self.get_default_storage(user, storage_obj)
def get_default_storage(self, user):
def get_default_storage(self, user, storage_obj):
admin_obj = UserInfo.objects.filter(is_superuser=True).order_by('pk').first()
if admin_obj and admin_obj.storage:
return self.get_storage(admin_obj)
return self.get_storage(admin_obj, storage_obj)
else:
storage_lists = THIRD_PART_CONFIG.get('storage')
for storage in storage_lists:

@ -4,11 +4,12 @@
# author: liuyu
# date: 2020/5/7
import os
from fir_ser.settings import SUPER_SIGN_ROOT, SERVER_DOMAIN, CAPTCHA_LENGTH
from fir_ser.settings import SUPER_SIGN_ROOT, SERVER_DOMAIN, CAPTCHA_LENGTH, MEDIA_ROOT
from api.models import APPSuperSignUsedInfo, APPToDeveloper, \
UDIDsyncDeveloper
from api.utils.app.randomstrings import make_app_uuid
from api.utils.storage.localApi import LocalStorage
from api.utils.storage.storage import Storage
from django.db.models import Sum
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
@ -104,3 +105,9 @@ def valid_captcha(cptch_key, code, username):
if cptch_key and code and code.strip(" ").lower() == challenge.get("challenge").lower():
return True
return False
def upload_oss_default_head_img(user_obj, storage_obj):
head_img_full_path = os.path.join(MEDIA_ROOT, "head_img.jpeg")
storage_obj = Storage(user_obj, storage_obj)
return storage_obj.upload_file(head_img_full_path)

@ -11,6 +11,7 @@ from rest_framework.response import Response
import json
from api.utils.storage.caches import del_cache_storage
from api.models import AppStorage, UserInfo
from api.utils.utils import upload_oss_default_head_img
from api.utils.serializer import StorageSerializer
import logging
@ -65,9 +66,19 @@ class StorageView(APIView):
serializer = StorageSerializer(data=data, context={'user_obj': request.user})
if serializer.is_valid():
serializer.save()
storage_obj = serializer.save()
if storage_obj:
if upload_oss_default_head_img(request.user, storage_obj):
res.msg = serializer.validated_data
logger.info("user %s add new storage success" % (request.user))
else:
logger.error("user %s add new storage failed" % (request.user))
res.msg = "文件上传校验失败,请检查参数是否正确"
res.code = 1005
else:
logger.info("user %s add new storage failed" % (request.user))
res.msg = serializer.errors
res.code = 1005
else:
logger.info("user %s add new storage failed" % (request.user))
res.msg = serializer.errors
@ -101,12 +112,27 @@ class StorageView(APIView):
storage_id = data.get("id", None)
if storage_id:
if storage_id == request.user.storage.id:
res.msg = '存储正在使用中,无法修改'
res.code = 1007
return Response(res.dict)
storage_obj = AppStorage.objects.filter(id=storage_id, user_id=request.user).first()
serializer = StorageSerializer(instance=storage_obj, data=data, context={'user_obj': request.user},
partial=True)
if serializer.is_valid():
serializer.save()
storage_obj = serializer.save()
if storage_obj:
if upload_oss_default_head_img(request.user, storage_obj):
res.msg = serializer.validated_data
logger.info("user %s add new storage success" % (request.user))
else:
logger.error("user %s add new storage failed" % (request.user))
res.msg = "文件上传校验失败,请检查参数是否正确"
res.code = 1005
else:
logger.info("user %s add new storage failed" % (request.user))
res.msg = serializer.errors
res.code = 1005
else:
res.msg = serializer.errors
res.code = 1005

Loading…
Cancel
Save