from rest_framework.response import Response
from rest_framework import generics
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.permissions import IsAuthenticated
from pool.response import FitJSONRenderer
from rest_framework import status
from rest_framework.filters import SearchFilter
import logging
from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
import random
import upyun
import os
from rest_framework import serializers
log = logging.getLogger(__name__)
def random_str(n):
"""随机生成n位字符串"""
return ''.join(random.sample('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLNOPQRSTUVWYZ', n))
class AppFileUploadSerializer(serializers.ModelSerializer):
app_file = serializers.FileField()
class Meta:
model = AppVersionConfig
fields = ['app_file']
class ApkUploadView(generics.CreateAPIView):
parser_classes = (MultiPartParser, FormParser)
authentication_classes = (JWTAuthentication,)
renderer_classes = (FitJSONRenderer,)
def post(self, request, *args, **kwargs):
serializer = AppFileUploadSerializer(data=request.data)
if not serializer.is_valid():
return Response({"message": str(serializer.errors)}, status=400)
else:
app_file = request.data.get('app_file')
suffix = app_file.name.split('.')[-1]
if suffix in ('apk',):
new_name = random_str(16) + '.apk'
with open(new_name, 'wb') as f: # 二进制写入
for i in app_file.chunks():
f.write(i)
# 新建 又拍云上传对象
up = upyun.UpYun('xxxx', 'xxx', 'xxxx', timeout=30,
endpoint=upyun.ED_AUTO)
with open(new_name, 'rb') as f:
res = up.put(app_file.name, f, checksum=False)
# 删除文件
try:
os.remove(new_name)
except Exception as e:
log.error('ApkUploadView {} e {}'.format(type(e), e))
return Response(res, status=200)
else:
return Response({"message": '请求参数错误'}, status=status.HTTP_400_BAD_REQUEST)