OTAEquipment.py 23 KB

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