class TestView(View):
def get(self, request):
firmware_path = firmware_obj.firmware_path
# 下载文件
if firmware_path.startswith("/data/"): # 本地文件
file_name = os.path.split(firmware_path)[-1]
data = file_iterator(firmware_path)
else: # 文件流
oss = Oss(**settings.ALI_OSS_CONF["narwal_firmware_private"])
res = oss.download_stream(firmware_path)
file_name = firmware_path
if not res:
return JsonResponse({'msg': 'system oss error'})
data = file_iterator_file_object(res)
response = StreamingHttpResponse(data)
response['FILE_NAME'] = file_name
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename=%s' % file_name
return response
def file_iterator(file_name, chunk_size=8888):
with open(file_name, "rb") as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
def file_iterator_file_object(file_object, chunk_size=8888):
while True:
c = file_object.read(chunk_size)
if c:
yield c
else:
break