Django 实现文件下载

之前实现了Django文件上传,有兴趣的同学可以了解一下---->Django rest_framework 实现上传图片以及Django 上传图片存储到数据库中

这里总结记录一下如何实现文件下载。

这里根据文件的id来看请求的文件是哪一个,视图继承的是ModelVIEWSet

  1. 获取前端传过来的id
 id = request.data.get('id', None)
  1. 根据id获取对应的QuerySet
 obj = models.Source.objects.filter(id=id).first() # 根据id获取文件的位置
  1. 拼接为绝对位置

    staic是本人自己定义的包含所有media文件的一个总文件名,拼接出来的file_path大家需要自己检查一下是否正确,并进行修改

  file_path = os.path.join(os.getcwd(), 'static/', str(obj.file)).replace('\\', '/') # 拼接为绝对位置
  1. 使用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请求

在这里插入图片描述

posted @ 2021-02-16 22:51  沃特艾文儿  阅读(23)  评论(0)    收藏  举报  来源