对于小文件,可以直接通过read()函数全部读取,并返回;但是对于大文件,全部读取,加载到内存中,再返回,这个不仅会过多耗费资源,而且容易造成传输缓慢,下面是自己使用django封装的下载大文件代码
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
@api_view(('GET',))
@permission_classes((AllowAny,))
def load_nearest_intell(request):
""" 下载数据
"""
def file_iterator(file_name, chunk_size=512):
# 文件读取迭代器
try:
with open(file_name, 'rb') as f:
while True:
data = f.read(chunk_size)
if data:
yield data
else:
break
except IOError as e:
print(e)
filename = request.GET.get('filename', None)
path = '' # 自己文件的路径
filename = os.path.join(path, filename)
response = StreamingHttpResponse(file_iterator(filename))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{0}"'.format(nearest_filename)
# 注意此处如果想返回更多的参数,可以在response中添加,以字典的形式写入,获取参数在headers中获取
return response
测试API:
import requests
url = '自己封装的API的请求路径'
resp = requests.get(url)
print(resp.status_code)
headers = resp.headers # 封装的所有传递的参数,都可以在headers中获取
filename = headers['Content-Disposition'].split('=')[-1].strip('"')
print(filename)
with open(filename, 'wb') as f:
for line in resp.iter_content(512): # 此处接受也必须以迭代器的形式获取,512以每次读取迭代的大小为准
f.write(line)