Django 实现文件下载
之前实现了Django文件上传,有兴趣的同学可以了解一下---->Django rest_framework 实现上传图片以及Django 上传图片存储到数据库中
这里总结记录一下如何实现文件下载。
这里根据文件的id来看请求的文件是哪一个,视图继承的是ModelVIEWSet
- 获取前端传过来的id
id = request.data.get('id', None)
- 根据id获取对应的QuerySet
obj = models.Source.objects.filter(id=id).first() # 根据id获取文件的位置
-
拼接为绝对位置
staic是本人自己定义的包含所有media文件的一个总文件名,拼接出来的file_path大家需要自己检查一下是否正确,并进行修改
file_path = os.path.join(os.getcwd(), 'static/', str(obj.file)).replace('\\', '/') # 拼接为绝对位置
- 使用FileResponse 来进行文件读取传输
file = open(file_path, 'rb') # 使用FileResponse 来进行文件读取传输
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename={}'.format(str(obj.file))
return response
下面为全部代码
class ResourceViewSet(ModelViewSet):
parser_classes = [MultiPartParser, JSONParser, FormParser]
"""视图集"""
queryset = models.Source.objects.all()
serializer_class = SourceModelSerializer
# 搜索
search_fields = ('id')
@action(methods=['get'], detail=False)
@csrf_exempt
def get_resource(self, request, *args, **kwargs):
id = request.data.get('id', None) # 获取前端传过来的id
if id:
print(id)
obj = models.Source.objects.filter(id=id).first() # 根据id获取文件的位置
if obj:
file_path = os.path.join(os.getcwd(), 'static/', str(obj.file)).replace('\\', '/') # 拼接为绝对位置
file = open(file_path, 'rb') # 使用FileResponse 来进行文件读取传输
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename={}'.format(str(obj.file))
return response
else:
return Response(status=status.HTTP_204_NO_CONTENT)
else:
return Response(status=status.HTTP_204_NO_CONTENT)
演示
这里使用postman来发送get请求


浙公网安备 33010602011771号