OTAEquipment.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. import hashlib
  2. import os
  3. import simplejson as json
  4. import time
  5. import traceback
  6. from wsgiref.util import FileWrapper
  7. from zlib import crc32
  8. from django.http import HttpResponse
  9. from django.utils.decorators import method_decorator
  10. from django.views.decorators.csrf import csrf_exempt
  11. from django.views.generic import TemplateView
  12. from Ansjer.config import BASE_DIR
  13. from Ansjer.config import SERVER_DOMAIN
  14. from Ansjer.config import SERVER_TYPE
  15. from Model.models import Device_User
  16. from Model.models import Equipment_Version
  17. from Object.ResponseObject import ResponseObject
  18. from Object.TokenObject import TokenObject
  19. from Object.UrlTokenObject import UrlTokenObject
  20. from Service.CommonService import CommonService
  21. from Service.ModelService import ModelService
  22. def downloadUrl(fileType, fileCode, fileVersion, fileName):
  23. fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
  24. if fileType == 'IPC':
  25. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  26. elif fileType == 'DVR':
  27. Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  28. elif fileType == 'NVR':
  29. Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  30. elif fileType == 'XVR':
  31. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  32. else:
  33. if fileType == 'CHM':
  34. Path = fileName
  35. else:
  36. Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
  37. if os.path.isfile(Path):
  38. try:
  39. JSON = json.dumps(
  40. {
  41. "result_code": 0,
  42. "reason": 'Success',
  43. "result": {},
  44. "error_code": 0,
  45. }, ensure_ascii=False
  46. )
  47. wrapper = FileWrapper(open(Path, 'rb'))
  48. response = HttpResponse(wrapper, content_type="application/octet-stream")
  49. response['Content-Length'] = os.path.getsize(Path)
  50. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
  51. response['Content-MD5'] = getMD5orSHA265(Path)
  52. response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
  53. response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
  54. response['Content-Error'] = JSON
  55. return response
  56. except Exception as e:
  57. res = ResponseObject()
  58. errorJSON = res.formal(906, {'details': repr(e)})
  59. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  60. response['Content-Error'] = errorJSON
  61. return response
  62. else:
  63. res = ResponseObject()
  64. errorJSON = res.formal(907)
  65. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  66. response['Content-Error'] = errorJSON
  67. return response
  68. def getMD5orSHA265(fileName, encryptionType='MD5'):
  69. """
  70. :param filePath:
  71. :param encryptionType:
  72. :return:
  73. """
  74. if not os.path.isfile(fileName):
  75. return ''
  76. else:
  77. if encryptionType == 'MD5':
  78. encryption = hashlib.md5()
  79. elif encryptionType == 'SHA265':
  80. encryption = hashlib.sha256()
  81. elif encryptionType == 'CRC32':
  82. f = open(fileName, 'rb')
  83. chunk = f.read()
  84. return crc32(chunk)
  85. f = open(fileName, 'rb')
  86. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  87. while True:
  88. chunk = f.read(block_size)
  89. if not chunk:
  90. break
  91. encryption.update(chunk)
  92. f.close()
  93. return encryption.hexdigest()
  94. @csrf_exempt
  95. def downloadUpdataFileUrl(request):
  96. response = ResponseObject()
  97. if request.method == 'GET':
  98. request_dict = request.GET
  99. elif request.method == 'POST':
  100. request_dict = request.POST
  101. else:
  102. errorJSON = response.formal(444)
  103. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  104. response['Content-Error'] = errorJSON
  105. return response
  106. fileType = request_dict.get('fileType', None)
  107. fileCode = request_dict.get('fileCode', None)
  108. fileVersion = request_dict.get('fileVersion', None)
  109. fileName = request_dict.get('fileName', None)
  110. if fileType != None and fileCode != None and fileVersion != \
  111. None and fileName != None:
  112. return downloadUrl(fileType, fileCode, fileVersion, fileName, response)
  113. else:
  114. errorJSON = response.formal(444)
  115. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  116. response['Content-Error'] = errorJSON
  117. return response
  118. @csrf_exempt
  119. def getEquipmentVersionInterface(request):
  120. response = ResponseObject()
  121. if request.method == "POST":
  122. request.encoding = 'utf-8'
  123. request_dict = request.POST
  124. elif request.method == "GET":
  125. request.encoding = 'gb2312'
  126. request_dict = request.GET
  127. else:
  128. return response.json(444)
  129. code = request_dict.get('code', None)
  130. ov = request_dict.get('ov', None)
  131. if not code:
  132. return response.json(444, 'code')
  133. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  134. if not eqs.exists():
  135. return response.json(900)
  136. if ov is not None:
  137. # 判断大小
  138. nv = eqs[0].softwareVersion
  139. if ov > nv:
  140. return response.json(0, {'softwareVersion': ov})
  141. equipment = eqs[0]
  142. return response.json(0, {'softwareVersion': equipment.softwareVersion})
  143. @csrf_exempt
  144. def getUpdataFileUrlInterface(request):
  145. response = ResponseObject()
  146. request.encoding = 'utf-8'
  147. if request.method == "POST":
  148. code = request.POST.get('code', None)
  149. elif request.method == "GET":
  150. code = request.GET.get('code', None)
  151. else:
  152. return response.json(444)
  153. if not code:
  154. return response.json(444, 'code')
  155. eq = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  156. # 判断是否有版本存在
  157. if not eq.exists():
  158. return response.json(902)
  159. file_path = eq[0].filePath
  160. urls = []
  161. if file_path:
  162. if file_path.find('static/Upgrade/') != -1:
  163. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  164. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  165. urls.append(url)
  166. if file_path.find('static/otapack') != -1:
  167. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  168. urls.append(url)
  169. if len(urls) > 0:
  170. res = {
  171. "urlCount": len(urls),
  172. "url": urls,
  173. "fileSize": eq[0].fileSize,
  174. "Description": eq[0].Description,
  175. }
  176. return response.json(0, res)
  177. else:
  178. return response.json(901)
  179. @csrf_exempt
  180. def downloadUpdataFileUrlInterface(request, fileType, fileName,
  181. *callback_args, **callback_kwargs):
  182. res = ResponseObject()
  183. if fileType is not None and fileName is not None:
  184. fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
  185. if fileType == 'IPC':
  186. fullPath += 'IPC/' + fileName
  187. elif fileType == 'DVR':
  188. fullPath += 'DVR/' + fileName
  189. elif fileType == 'NVR':
  190. fullPath += 'NVR/' + fileName
  191. elif fileType == 'XVR':
  192. fullPath += 'XVR/' + fileName
  193. elif fileType == 'User':
  194. fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
  195. fullPath += 'User/' + fileName
  196. elif fileType == 'ADCloud':
  197. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  198. fullPath += 'ADCloud/' + fileName
  199. elif fileType == 'ACCloud':
  200. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  201. fullPath += 'ACCloud/' + fileName
  202. else:
  203. fullPath += 'Other/' + fileName
  204. print(fullPath)
  205. if os.path.isfile(fullPath):
  206. try:
  207. JSON = res.formal(0)
  208. if fileType != 'User':
  209. wrapper = FileWrapper(open(fullPath, 'rb'))
  210. response = HttpResponse(wrapper, content_type="application/octet-stream")
  211. response['Content-Length'] = os.path.getsize(fullPath)
  212. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  213. response['Content-MD5'] = getMD5orSHA265(fullPath)
  214. # 校验文件md5值
  215. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  216. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  217. response['Content-Error'] = JSON
  218. return response
  219. else:
  220. Imagedata = open(fullPath, 'rb').read()
  221. response = HttpResponse(Imagedata, content_type="image/jpeg")
  222. return response
  223. except Exception as e:
  224. errorJSON = res.formal(906)
  225. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  226. response['Content-Error'] = errorJSON
  227. return response
  228. else:
  229. errorJSON = res.formal(907)
  230. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  231. response['Content-Error'] = errorJSON
  232. return response
  233. else:
  234. errorJSON = res.formal(444)
  235. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  236. response['Content-Error'] = errorJSON
  237. return response
  238. class getUploadFiletoDirView(TemplateView):
  239. @method_decorator(csrf_exempt)
  240. def dispatch(self, *args, **kwargs):
  241. return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
  242. def post(self, request, *args, **kwargs):
  243. request.encoding = 'utf-8'
  244. request_dict = request.POST
  245. fileName = request.FILES.get('fileName', None)
  246. return self.ValidationError(request_dict, fileName)
  247. def get(self, request, *args, **kwargs):
  248. request.encoding = 'gb2312'
  249. request_dict = request.GET
  250. fileName = request.FILES.get('fileName', None)
  251. return self.ValidationError(request_dict, fileName)
  252. def ValidationError(self, request_dict, fileName):
  253. response = ResponseObject()
  254. token = request_dict.get('token', None)
  255. fileType = request_dict.get('fileType', None)
  256. fileCode = request_dict.get('fileCode', None)
  257. fileVersion = request_dict.get('fileVersion', None)
  258. if not fileName or not fileType:
  259. return response.json(444, 'fileName,fileType')
  260. tko = TokenObject(token)
  261. response.lang = tko.lang
  262. if tko.code != 0:
  263. return response.json(tko.code)
  264. userID = tko.userID
  265. if not userID:
  266. return response.json(104)
  267. own_perm = ModelService.check_perm(userID=userID, permID=210)
  268. if not own_perm:
  269. return response.json(404)
  270. if fileVersion != None and fileCode != None:
  271. return self.getUploadFiletoDir(userID, fileType, fileName, response, fileCode,
  272. fileVersion=fileVersion)
  273. else:
  274. return self.getUploadFiletoDir(userID, fileType, fileName, response)
  275. def getUploadFiletoDir(self, userID, fileType, fileName, response, *args, **kwargs):
  276. """
  277. 将上传的文件写入服务器对应目录下
  278. :param Type: equipment type
  279. :param fileName: File name of upgrade file.
  280. :return: filePath
  281. """
  282. User = Device_User.objects.filter(userID=userID)
  283. if not User:
  284. return response.json(104)
  285. own_perm = ModelService.check_perm(userID, permID=210)
  286. if own_perm is not True:
  287. return response.json(404)
  288. updataFile = fileName.name
  289. updataFile = updataFile.replace(' ', '+')
  290. versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
  291. codeIndex = versionIndex + 12
  292. if codeIndex != -1 and versionIndex != -1:
  293. fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
  294. fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
  295. updataFile[versionIndex + 1: codeIndex] or None
  296. if fileCode is not None and fileVersion is not None:
  297. return self.getDir(fileType, fileName, fileCode, fileVersion, response)
  298. else:
  299. fileCode = kwargs.get('fileCode', None)
  300. fileVersion = kwargs.get('fileVersion', None)
  301. print(fileCode, fileVersion)
  302. if fileCode != None and fileVersion != None:
  303. return self.getDir(fileType, fileName, fileCode, fileVersion)
  304. else:
  305. return response.json(903)
  306. else:
  307. fileCode = kwargs.get('fileCode', None)
  308. fileVersion = kwargs.get('fileVersion', None)
  309. if fileCode != None and fileVersion != None:
  310. return self.getDir(fileType, fileName, fileCode, fileVersion, response)
  311. else:
  312. return response.json(903)
  313. def getDir(self, fileType, fileName, fileCode, fileVersion, response):
  314. try:
  315. if fileCode != None and fileVersion != None:
  316. path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
  317. else:
  318. if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
  319. path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
  320. if not os.path.exists(path):
  321. os.makedirs(path)
  322. file_name = path + str(fileName)
  323. if os.path.exists(file_name):
  324. os.remove(file_name)
  325. destination = open(file_name, 'wb+')
  326. for chunk in fileName.chunks():
  327. destination.write(chunk)
  328. destination.close()
  329. else:
  330. file_name = path + str(fileName)
  331. if os.path.exists(file_name):
  332. os.remove(file_name)
  333. destination = open(file_name, 'wb+')
  334. for chunk in fileName.chunks():
  335. destination.write(chunk)
  336. destination.close()
  337. except Exception as e:
  338. errorInfo = traceback.format_exc()
  339. print('上传文件错误: %s' % errorInfo)
  340. return response.json(700, {'details': repr(e)})
  341. else:
  342. index = file_name.find('static/')
  343. filePath = file_name[index:]
  344. return response.json(0, {'filePath': filePath})
  345. @csrf_exempt
  346. def addNewEquipmentVersionInterface(request):
  347. request.encoding = 'utf-8'
  348. response = ResponseObject()
  349. if request.method == "POST":
  350. request_dict = request.POST
  351. elif request.method == "GET":
  352. request_dict = request.GET
  353. else:
  354. return response.json(444)
  355. deviceContent = request_dict.get('content', None).encode('utf-8')
  356. token = request_dict.get('token', None)
  357. file_s = request.FILES.get('file', None)
  358. deviceContent = str(deviceContent, encoding='utf-8')
  359. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  360. if deviceContent is None:
  361. return response.json(444, 'content')
  362. tko = TokenObject(token)
  363. response.lang = tko.lang
  364. if tko.code != 0:
  365. return response.json(tko.code)
  366. userID = tko.userID
  367. own_perm = ModelService.check_perm(userID=userID, permID=220)
  368. if own_perm is False:
  369. return response.json(404)
  370. try:
  371. deviceData = json.loads(deviceContent)
  372. version = deviceData.get('version', None)
  373. filePath = deviceData.get('filePath', None)
  374. code = deviceData.get('code', None)
  375. lang = deviceData.get('lang', None)
  376. if code and lang:
  377. try:
  378. Equipment_Version.objects.filter(code=code,lang=lang).delete()
  379. except Exception as e:
  380. pass
  381. if version is None or filePath is None:
  382. return response.json(444, 'content')
  383. deviceData['filePath'] = ','.join(filePath)
  384. paths = 'static/versions/image'
  385. if not os.path.exists(paths):
  386. os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
  387. # print ('该文件不存在')
  388. else:
  389. print ('该文件存在')
  390. print(file_s)
  391. if file_s is None:
  392. deviceData['img'] = ''
  393. else:
  394. rv_path = 'static/versions/image/' + code + '.png'
  395. try:
  396. as_path = os.path.join(BASE_DIR, rv_path)
  397. if os.path.exists(as_path):
  398. os.remove(as_path)
  399. with open(as_path, 'wb+') as destination:
  400. for chunk in file_s.chunks():
  401. destination.write(chunk)
  402. except Exception as e:
  403. pass
  404. else:
  405. deviceData['img'] = SERVER_DOMAIN + 'sysfile/' + rv_path
  406. ev_qs = Equipment_Version(
  407. eid=CommonService.getUserID(getUser=False, setOTAID=True),
  408. **deviceData)
  409. ev_qs.save()
  410. except Exception as e:
  411. return response.json(444, repr(e))
  412. else:
  413. res = CommonService.qs_to_dict([ev_qs])
  414. return response.json(0, res)
  415. def showAllEquipmentVersion(userID, response):
  416. userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
  417. if not userValid.exists():
  418. return response.json(104)
  419. own_perm = ModelService.check_perm(userID=userID, permID=240)
  420. if not own_perm:
  421. return response.json(404)
  422. qs = Equipment_Version.objects.all()
  423. res = CommonService.qs_to_dict(qs)
  424. return response.json(0, res)
  425. # 检测ota更新包
  426. @csrf_exempt
  427. def getNewVerInterface(request):
  428. response = ResponseObject()
  429. if request.method == "POST":
  430. request_dict = request.POST
  431. elif request.method == "GET":
  432. request_dict = request.GET
  433. else:
  434. return response.json(404)
  435. code = request_dict.get('code', None)
  436. token = request_dict.get('token', None)
  437. lang = request_dict.get('lang', None)
  438. if not code:
  439. return response.json(444, 'code')
  440. tko = TokenObject(token)
  441. response.lang = tko.lang
  442. if tko.code != 0:
  443. return response.json(tko.code)
  444. if lang == 'zh-Hans':
  445. equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang=lang).order_by(
  446. '-data_joined')
  447. else:
  448. equipmentValid = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by(
  449. '-data_joined')
  450. if equipmentValid.exists():
  451. ver = equipmentValid[0].softwareVersion
  452. equipment = equipmentValid[0]
  453. file_path = equipment.filePath
  454. # 检测ip进行替换
  455. # 创建url的token
  456. tko = UrlTokenObject()
  457. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  458. if SERVER_TYPE == 'Ansjer.formal_settings':
  459. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  460. else:
  461. if code == '18E201200CA' or code == '18E201200CZ':
  462. url = 'http://www.zositech.xyz/dlotapack/' + file_path
  463. else:
  464. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  465. return response.json(0, {
  466. 'ver': ver,
  467. 'url': url,
  468. "Description": equipment.Description,
  469. })
  470. else:
  471. return response.json(902)
  472. # ota包上传
  473. class uploadOTAInterfaceView(TemplateView):
  474. @method_decorator(csrf_exempt)
  475. def dispatch(self, *args, **kwargs):
  476. return super(uploadOTAInterfaceView, self).dispatch(*args, **kwargs)
  477. def post(self, request, *args, **kwargs):
  478. request.encoding = 'utf-8'
  479. token = request.POST.get('token', None)
  480. fileName = request.FILES.get('fileName', None)
  481. fileType = request.POST.get('fileType', None)
  482. language = request.POST.get('language', None)
  483. return self.validate(token, fileName, fileType, language)
  484. def get(self, request, *args, **kwargs):
  485. request.encoding = 'gb2312'
  486. token = request.GET.get('token', None)
  487. fileName = request.FILES.get('fileName', None)
  488. fileType = request.GET.get('fileType', None)
  489. language = request.GET.get('language', None)
  490. return self.validate(token, fileName, fileType, language)
  491. def validate(self, token, fileName, fileType, language):
  492. response = ResponseObject()
  493. if not fileName or not fileType:
  494. return response.json(444, 'fileName,fileType')
  495. tko = TokenObject(token)
  496. response.lang = tko.lang
  497. if tko.code != 0:
  498. return response.json(tko.code)
  499. userID = tko.userID
  500. if not userID:
  501. return response.json(104)
  502. own_permission = ModelService.check_perm(userID=userID, permID=210)
  503. if own_permission is not True:
  504. return response.json(404)
  505. return self.upload_ota_file(fileName, response, fileType, language)
  506. def upload_ota_file(self, fileName, response, fileType, language):
  507. try:
  508. if not language:
  509. language = 0
  510. path = '/'.join((BASE_DIR, 'static/otapack', fileType, str(language))).replace('\\', '/') + '/'
  511. if not os.path.exists(path):
  512. os.makedirs(path)
  513. file_name = path + str(fileName)
  514. if os.path.exists(file_name):
  515. os.remove(file_name)
  516. destination = open(file_name, 'wb+')
  517. for chunk in fileName.chunks():
  518. destination.write(chunk)
  519. destination.close()
  520. else:
  521. file_name = path + str(fileName)
  522. if os.path.exists(file_name):
  523. os.remove(file_name)
  524. destination = open(file_name, 'wb+')
  525. for chunk in fileName.chunks():
  526. destination.write(chunk)
  527. destination.close()
  528. except Exception as e:
  529. errorInfo = traceback.format_exc()
  530. print('上传文件错误: %s' % errorInfo)
  531. return response.json(700, {'details': repr(e)})
  532. else:
  533. index = file_name.find('static/')
  534. filePath = file_name[index:]
  535. return response.json(0, {'filePath': filePath})
  536. # ota包下载
  537. @csrf_exempt
  538. def downloadOTAInterface(request, fullPath, *callback_args, **callback_kwargs):
  539. res = ResponseObject()
  540. print('fullPath:')
  541. print(fullPath)
  542. if fullPath:
  543. if os.path.isfile(fullPath):
  544. try:
  545. wrapper = FileWrapper(open(fullPath, 'rb'))
  546. response = HttpResponse(wrapper, content_type="application/octet-stream")
  547. response['Content-Length'] = os.path.getsize(fullPath)
  548. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  549. response['Content-MD5'] = getMD5orSHA265(fullPath)
  550. # 校验文件md5值
  551. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  552. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  553. response['Content-Error'] = res.formal(0)
  554. return response
  555. except Exception as e:
  556. return res.json(906, repr(e))
  557. else:
  558. return res.json(907)
  559. else:
  560. return res.json(444, 'fullPath')
  561. # ota包下载
  562. @csrf_exempt
  563. def downloadOTAInterfaceV2(request, fullPath, *callback_args, **callback_kwargs):
  564. res = ResponseObject()
  565. print('fullPath:')
  566. print(fullPath)
  567. # 解密url的token
  568. url_token = UrlTokenObject(fullPath)
  569. if ('' == url_token.Url):
  570. print('过期了')
  571. return res.json(907)
  572. else:
  573. print(url_token.Url)
  574. fp = url_token.Url
  575. fullPath = fp[14:]
  576. if fullPath:
  577. if os.path.isfile(fullPath):
  578. try:
  579. wrapper = FileWrapper(open(fullPath, 'rb'))
  580. response = HttpResponse(wrapper, content_type="application/octet-stream")
  581. response['Content-Length'] = os.path.getsize(fullPath)
  582. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  583. response['Content-MD5'] = getMD5orSHA265(fullPath)
  584. # 校验文件md5值
  585. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  586. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  587. response['Content-Error'] = res.formal(0)
  588. return response
  589. except Exception as e:
  590. return res.json(906, repr(e))
  591. else:
  592. return res.json(907)
  593. else:
  594. return res.json(444, 'fullPath')