Explorar o código

pc端软件安装包上传下载查询删除操作

lhq %!s(int64=4) %!d(string=hai) anos
pai
achega
fb142f9be3
Modificáronse 3 ficheiros con 382 adicións e 2 borrados
  1. 4 1
      Ansjer/urls.py
  2. 356 0
      Controller/PcInfo.py
  3. 22 1
      Model/models.py

+ 4 - 1
Ansjer/urls.py

@@ -18,7 +18,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     VerifyCodeController, FileController, UIDController, LogController, SalesController, \
     VerifyCodeController, FileController, UIDController, LogController, SalesController, \
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
-    DetectControllerV2, ShadowController, TestDetectController
+    DetectControllerV2, ShadowController, TestDetectController, PcInfo
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -320,6 +320,9 @@ urlpatterns = [
     #设备确定分配地区
     #设备确定分配地区
     url(r'^device/confirmRegion$', DeviceConfirmRegion.ConfirmRegion.as_view()),
     url(r'^device/confirmRegion$', DeviceConfirmRegion.ConfirmRegion.as_view()),
 
 
+    # pc端软件信息
+    url(r'^pcInfo/(?P<operation>.*)$', PcInfo.PcInfo.as_view()),
+
     re_path('(?P<path>.*)', LogManager.errorPath),
     re_path('(?P<path>.*)', LogManager.errorPath),
 
 
 
 

+ 356 - 0
Controller/PcInfo.py

@@ -0,0 +1,356 @@
+import hashlib
+import shutil
+import time
+import traceback
+import os
+from urllib import request
+
+from django.http import HttpResponse
+
+from django.views.generic.base import View
+
+from Model.models import Pc_Info
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, BASE_DIR
+import boto3
+import botocore
+from botocore import client
+from wsgiref.util import FileWrapper
+from zlib import crc32
+
+
+class PcInfo(View):
+    def dispatch(self, requset, *args, **kwargs):
+        return super(PcInfo, self).dispatch(requset, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
+        request.encoding = 'utf-8'
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        operation = kwargs.get('operation')
+        request.encoding = 'utf-8'
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject()
+        if not operation:
+            return response.json(444, 'operation')
+        else:
+
+            if operation == 'query':
+                return self.query(request_dict, response)
+            elif operation == 'addandupload':   # 上传到服务器
+                return self.addandupload(request_dict, response, request)
+            elif operation == 'download':   # 服务器下载
+                return self.download(request_dict, response)
+            elif operation == 'delete':
+                return self.delete(request_dict, response)
+            elif operation == 's3addandupload':
+                return self.s3addandupload(request_dict, response, request)
+            elif operation == 's3download':
+                return self.s3download(request_dict, response)
+            else:
+                return response.json(414)
+
+    def addandupload(self, request_dict, response, request):
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        if not userID:
+            return response.json(104)
+        pc_name = request_dict.get('pc_name', None)
+        bundle_version = request_dict.get('bundle_version', None)
+        pc_version = request_dict.get('pc_version', None)
+        pc_test = request_dict.get('pc_test', None)
+        lang = request_dict.get('lang', None)
+        file_name = request.FILES.get('file_name', None)
+        param_flag = CommonService.get_param_flag(
+            data=[pc_name, bundle_version, pc_version, pc_test, lang, file_name])
+        if param_flag is not True:
+            return response.json(444)
+        else:
+            file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version,
+                                          pc_version=pc_version)
+            if file:
+                return response.json(174)
+            try:
+                # 安装包上传到服务器本地
+                # file_path = 'static/pc/' + pc_name + '/' + bundle_version + '/' + pc_version + '/' + pc_test
+                file_path = 'static/pc/' + pc_name + '/' + bundle_version + '_' + pc_version + '_' + pc_test
+                if not os.path.exists(file_path):
+                    os.makedirs(os.path.join(BASE_DIR, file_path))
+                file_path = file_path + '/' + str(file_name)
+                upload_path = os.path.join(BASE_DIR, file_path)
+                with open(upload_path, 'wb+') as destination:
+                    for chunk in file_name.chunks():
+                        destination.write(chunk)
+                add_time = time.time()
+                create_dict = {
+                    'pc_name': pc_name,
+                    'bundle_version': bundle_version,
+                    'pc_version': pc_version,
+                    'pc_test': pc_test,
+                    'lang': lang,
+                    'download_link': file_path,
+                    'add_time': add_time,
+                    'update_time': add_time
+                }
+                pc_Info = Pc_Info(**create_dict)
+                pc_Info.save()
+            except Exception:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(500, {'details': errorInfo})
+            else:
+                if pc_Info.id:
+                    res = {'pc_name': pc_Info.pc_name,
+                           'bundle_version': pc_Info.bundle_version,
+                           'pc_version': pc_Info.pc_version,
+                           'pc_test': pc_Info.pc_test,
+                           'download_link': pc_Info.download_link,
+                           'lang': pc_Info.lang,
+                           'add_time': pc_Info.add_time,
+                           'update_time': pc_Info.update_time
+                           }
+                    return response.json(0, res)
+                else:
+                    return response.json(500)
+
+    def query(self, request_dict, response):
+        pc_name = request_dict.get('pc_name', None)
+        queryset = Pc_Info.objects.filter(pc_name=pc_name)
+        if queryset.exists():
+            count = queryset.count()
+            res = queryset
+            send_json = CommonService.qs_to_dict(res)
+            send_json['count'] = count
+            return response.json(0, send_json)
+        else:
+            return response.json(173)
+
+    def download(self, request_dict, response):
+        pc_name = request_dict.get('pc_name', None)
+        bundle_version = request_dict.get('bundle_version', None)
+        pc_version = request_dict.get('pc_version', None)
+        pc_test = request_dict.get('pc_test', None)
+        param_flag = CommonService.get_param_flag(
+            data=[pc_name, bundle_version, pc_version, pc_test])
+        if param_flag is not True:
+            return response.json(444)
+        path = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version,
+                                      pc_test=pc_test).values('download_link')
+        if not path:
+            return response.json(173)
+        filepath = path[0]['download_link']
+        fullPath = os.path.join(BASE_DIR, filepath)
+        fullPath.replace('\\', '/')
+        res = ResponseObject()
+        print('fullPath:')
+        print(fullPath)
+        print(os.path.basename(fullPath))
+        if fullPath:
+            if os.path.isfile(fullPath):
+                try:
+                    wrapper = FileWrapper(open(fullPath, 'rb'))
+                    response = HttpResponse(wrapper, content_type="application/octet-stream")
+                    response['Content-Length'] = os.path.getsize(fullPath)
+                    response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
+                    response['Content-MD5'] = getMD5orSHA265(fullPath)
+                    # 校验文件md5值
+                    response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
+                    response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
+                    response['Content-Error'] = res.formal(0)
+                    return response
+                except Exception as e:
+                    return res.json(906, repr(e))
+            else:
+                return res.json(907)
+        else:
+            return res.json(444, 'fullPath')
+
+    def delete(self, request_dict, response):
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        if not userID:
+            return response.json(104)
+        pc_name = request_dict.get('pc_name', None)
+        bundle_version = request_dict.get('bundle_version', None)
+        pc_version = request_dict.get('pc_version', None)
+        pc_test = request_dict.get('pc_test', None)
+        param_flag = CommonService.get_param_flag(
+            data=[pc_name, bundle_version, pc_version, pc_test])
+        if param_flag is not True:
+            return response.json(444)
+        file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version,
+                                      pc_test=pc_test)
+        if not file.exists():
+            return response.json(173)
+        try:
+            # 删除文件,文件夹和数据库里的相应数据
+            file_path = file[0].download_link
+            file_path = os.path.join(BASE_DIR, file_path).replace('\\', '/')
+            os.remove(file_path)
+            file_path = file_path.split("/")
+            file_path = [str(i) for i in file_path][:-1]
+            file_path = "/".join(file_path)
+            shutil.rmtree(file_path)
+            file.delete()
+        except Exception as e:
+            return response.json(176, repr(e))
+        else:
+            return response.json(0)
+
+    def s3addandupload(self, request_dict, response, request):
+        token = request_dict.get('token', None)
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        if not userID:
+            return response.json(104)
+        pc_name = request_dict.get('pc_name', None)
+        bundle_version = request_dict.get('bundle_version', None)
+        pc_version = request_dict.get('pc_version', None)
+        pc_test = request_dict.get('pc_test', None)
+        lang = request_dict.get('lang', None)
+        file_name = request_dict.get('file_name', None)
+        param_flag = CommonService.get_param_flag(
+            data=[pc_name, bundle_version, pc_version, pc_test, lang, file_name])
+        if param_flag is not True:
+            return response.json(444)
+        else:
+            file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version,
+                                          pc_version=pc_version)
+            if file:
+                return response.json(174)
+            try:
+                # 把安装包上传到s3
+                aws_s3_guowai = boto3.client(
+                    's3',
+                    aws_access_key_id=AWS_ACCESS_KEY_ID[1],
+                    aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
+                    config=botocore.client.Config(signature_version='s3v4'),
+                    region_name='us-east-1'
+                )
+                download_link = '{pc_name}/{bundle_version}/{pc_version}/{file_s}'.format(
+                    pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version, file_s=str(file_name))
+                response_url = aws_s3_guowai.generate_presigned_url(
+                    ClientMethod='put_object',
+                    Params={
+                        'Bucket': 'pc-installation-package',
+                        'Key': download_link
+                    },
+                    ExpiresIn=3600
+                )
+                add_time = time.time()
+                create_dict = {
+                    'pc_name': pc_name,
+                    'bundle_version': bundle_version,
+                    'pc_version': pc_version,
+                    'pc_test': pc_test,
+                    'lang': lang,
+                    'download_link': download_link,
+                    'add_time': add_time,
+                    'update_time': add_time
+                }
+                pc_Info = Pc_Info(**create_dict)
+                pc_Info.save()
+            except Exception:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(500, {'details': errorInfo})
+            else:
+                if pc_Info.id:
+                    res = {'pc_name': pc_Info.pc_name,
+                           'bundle_version': pc_Info.bundle_version,
+                           'pc_version': pc_Info.pc_version,
+                           'pc_test': pc_Info.pc_test,
+                           'download_link': pc_Info.download_link,
+                           'lang': pc_Info.lang,
+                           'add_time': pc_Info.add_time,
+                           'update_time': pc_Info.update_time,
+                           'response_url': response_url
+                           }
+                    return response.json(0, res)
+                else:
+                    return response.json(500)
+
+    def s3download(self, request_dict, response):
+        pc_name = request_dict.get('pc_name', None)
+        bundle_version = request_dict.get('bundle_version', None)
+        pc_version = request_dict.get('pc_version', None)
+        if not pc_name or not pc_version or not bundle_version:
+            return response.json(444, 'pc_name,bundle_version,pc_version')
+        file = Pc_Info.objects.filter(pc_name=pc_name, bundle_version=bundle_version, pc_version=pc_version).values()
+        path = file[0]['download_link']
+        aws_s3_guowai = boto3.client(
+            's3',
+            aws_access_key_id=AWS_ACCESS_KEY_ID[1],
+            aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
+            config=botocore.client.Config(signature_version='s3v4'),
+            region_name='us-east-1'
+        )
+        response_url = aws_s3_guowai.generate_presigned_url(
+            ClientMethod='get_object',
+            Params={
+                'Bucket': 'pc-installation-package',
+                'Key': path
+            },
+            ExpiresIn=3600
+        )
+        res = {'pc_name': file[0]['pc_name'],
+               'bundle_version': file[0]['bundle_version'],
+               'pc_version': file[0]['pc_version'],
+               'pc_test': file[0]['pc_test'],
+               'download_link': file[0]['download_link'],
+               'lang': file[0]['lang'],
+               'add_time': file[0]['add_time'],
+               'update_time': file[0]['update_time'],
+               'response_url': response_url
+               }
+        return response.json(0, res)
+
+
+def getMD5orSHA265(fileName, encryptionType='MD5'):
+    """
+
+    :param filePath:
+    :param encryptionType:
+    :return:
+    """
+    if not os.path.isfile(fileName):
+        return ''
+    else:
+        if encryptionType == 'MD5':
+            encryption = hashlib.md5()
+        elif encryptionType == 'SHA265':
+            encryption = hashlib.sha256()
+        elif encryptionType == 'CRC32':
+            f = open(fileName, 'rb')
+            chunk = f.read()
+            return crc32(chunk)
+
+        f = open(fileName, 'rb')
+        block_size = 8192  # why is 8192 | 8192 is fast than 2048
+
+        while True:
+            chunk = f.read(block_size)
+            if not chunk:
+                break
+            encryption.update(chunk)
+
+        f.close()
+        return encryption.hexdigest()
+

+ 22 - 1
Model/models.py

@@ -1565,4 +1565,25 @@ class UIDMainUser(models.Model):
     class Meta:
     class Meta:
         db_table = 'uid_mainuser'
         db_table = 'uid_mainuser'
         verbose_name = '设备主用户表'
         verbose_name = '设备主用户表'
-        verbose_name_plural = verbose_name
+        verbose_name_plural = verbose_name
+
+
+class Pc_Info(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    pc_name = models.CharField(blank=True, max_length=32, verbose_name=u'软件名称')
+    bundle_version = models.CharField(blank=True, max_length=12, verbose_name=u'项目类型')
+    pc_version = models.CharField(blank=True, max_length=12, verbose_name=u'版本号')
+    pc_test = models.SmallIntegerField(default=0, verbose_name='测试版。0:否,1:是')
+    lang = models.CharField(blank=True, max_length=32, verbose_name=u'语言类型')
+    download_link = models.CharField(max_length=300, blank=True, default='', verbose_name='下载链接')
+    add_time = models.IntegerField(verbose_name='添加时间', default=0)
+    update_time = models.IntegerField(verbose_name='更新时间', default=0)
+
+    # def __str__(self):
+    #     return self.id
+
+    class Meta:
+        db_table = 'pc_info'
+        verbose_name = u'pc信息表'
+        verbose_name_plural = verbose_name
+        ordering = ('id',)