django-rest-framework文件上传接口实现

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

提供文件上传接口

代码实例

  • UploadView类提供了文件上传的方法
class UploadView(APIView):
    '''
    上传文件接口
    '''

    parser_classes = (MultiPartParser,)

    def post(self, request, format=None):
        
        code = 0
        msg = 'fail'
        #生成本次上传的版本号可根据需要控制精度
        accessory_v = datetime.now().strftime('%Y')
        # 获取多个file
        files = request.FILES.getlist('file', None)
        type = request.POST['type']
        for file_obj in files:

            # 将文件缓存到本地后上传
            local_file = local_file_path + '/' + file_obj.name
            # 读取传入的文件
            destination = open(filename, 'wb+')
            for chunk in file_obj.chunks():
                # 写入本地文件
                destination.write(chunk)
            destination.close()
            
            #拼接成S3服务器文件存放的地址
            myobject_name = '/' + type + '/'+ accessory_v + '/'+ file_obj.name
            # 上传至S3服务器
            s = S3Manager()
            f = s.upload(myobject_name, filename)
            if f != []:
                code=1
                msg='success'

        return Response(
            {
                "code": code,
                "message": msg,
         
            }
        )

注:当使用parser_classes = (MultiPartParser,)这种方式上传附件时,客户端请求请求头不能有Content-Type,否则会报错

  • S3Manager类提供对S3服务器文件的上传和下载功能,这里使用的是Minio存储服务,第三方的包为minio
pip3 install minio

class S3Manager(object):
    """
    提供s3文件的上传和下载功能

    """

    def __init__(self):
        """
        构造函数,初始化一个客户端

        """
        minioClient = Minio(settings.AWS_BUCKET_HOST, access_key=settings.AWS_ACCESS_KEY,
                            secret_key=settings.AWS_SECRET_KEY, secure=None)
        self.minioClient = minioClient

    def getFullObject(self, myobject_name, tempobject):
        """
        :param myobject_name: S3服务器上的文件
        :param tempobject: 生成本地上的文件
        :return:
        """
        try:
            self.minioClient.fget_object(settings.AWS_BUCKET_NAME, myobject_name, tempobject)
        except ResponseError as err:
            logger.error(err)

    def upload(self, myobject_name, file):
        """
        :param myobject_name: 存放到S3服务器上的文件,也包括路径哟
        :param file:本地服务器上的文件
        :return:etag上传后生成的文件ID,url上传后生成文件下载的URL
        """
        try:
            with open(file, 'rb') as file_data:
                file_stat = os.stat(file)
                etag = self.minioClient.put_object(settings.AWS_BUCKET_NAME, myobject_name, file_data,
                                                   file_stat.st_size)
                url = self.getUrl(myobject_name)
                return etag, url
        except ResponseError as err:
            logger.error(err)  # 异常写入error日志
            return False

    def getUrl(self, myobject_name):
        """
        :param myobject_name:存放到S3服务器上的文件 也包括路径哟
        :return: 生成的文件下载的URL地址,有效期为两天
        """
        try:
            url = self.minioClient.presigned_get_object(settings.AWS_BUCKET_NAME, myobject_name,
                                                        expires=timedelta(days=2))
        except ResponseError as err:
            logger.error(err)
        return url

使用minio更多操作大家可以官网查看

转载于:https://my.oschina.net/hellotest/blog/1995418

你可能感兴趣的:(django-rest-framework文件上传接口实现)