在项目开发过程中,文件存储无非就是第一,存放到我们自己的服务器,但是这种方式有一个很大的弊端就是随着用户的增加,存放到服务器的数据或者图片越来越多,那么就会很占服务器的带宽,这样后期会很影响服务器的性能,导致卡顿,第二就是使用阿里云的oss数据存储,但是注意,阿里云的域名需要配置一下,不然我们后端返回给前端的url,前端拿到url后拉取图片,会报跨域错误,配置下就可以了,阿里云存储文件有两种方式:

  1. 当用户上传图片时,前端向我们后端去请求一个接口,后端向阿里云要一个token,然后后端把拿到的token返回给前端,前端拿到token后直接向oss请求保存图片
  2. 前端直接把图片以流的方式发送给后端,后端自己去向oss发送请求保存图片,这里代码演示的就是这一种情况
import oss2
from api_share.aliyun_oss import ossconf

class OssFileUploading(object):
    """oss文件上传工具类"""
    
    def bytesfile(self, filename, content):
        """
        上传bytes类型数据:这里只上传头像
        objectsname: 请求图片的url
        content: 二进制的数据
        """
        auth = oss2.Auth(ossconf.OSS_ACCESSKEYID, ossconf.OSS_ACCESSKEYSECRET)
       
        bucket = oss2.Bucket(auth, ossconf.OSS_ENDPOINT, ossconf.OSS_BUCKETNAME)
        # 这里只上传到头像那个文件夹内
        objectsname = 'uploads/user_avatar/' + filename
        
        bucket.put_object(objectsname, content)
        
        return ossconf.OSS_REQUEST_URL + objectsname

    def assignurlfile(self, objectsname, content):
        """
        指定url
        objectsname: 不写死
        """
        auth = oss2.Auth(ossconf.OSS_ACCESSKEYID, ossconf.OSS_ACCESSKEYSECRET)

        bucket = oss2.Bucket(auth, ossconf.OSS_ENDPOINT, ossconf.OSS_BUCKETNAME)
    
        bucket.put_object(objectsname, content)

        return ossconf.OSS_REQUEST_URL + objectsname
# 阿里云oss配置

OSS_ACCESSKEYID = 'LTAI4G2Q1xxxxxxxcDtF'

OSS_ACCESSKEYSECRET = 'vjUHOKsIT8xxxxxxrxSq6eG'

OSS_BUCKETNAME = 'qxxxxxe5'

OSS_ENDPOINT = 'http://oss-cn-hangzhou.aliyuncs.com'

# https://oss-cn-hangzhou.aliyuncs.com + OSS_BUCKETNAME
OSS_REQUEST_URL = 'https://img.qxxxxxx.com/'


class TaskImageView(ListAPIView,DestroyAPIView,CreateAPIView,UpdateAPIView):
    """任务图片管理"""
    @transaction.atomic
    def create(self, request, *args, **kwargs):
        name = request.data.get('name','')
        is_show = request.data.get('is_show',False)
        image = request.FILES.get('image', None)
        if is_show == 'false':
            is_show = False
        else:
            is_show = True
        if not image:
            return APIResponse.fail(message='图片不能为空')
        if name and len(name)>=64:
            return APIResponse.fail(message='名称长度不能超出63位')
        last = image.name.split('.')[-1]
        if last not in ['jpeg', 'jpg', 'png', 'pdf', 'tga', 'tif', 'svg', 'gif', 'bmp']:
            return APIResponse.fail(message='不支持的图片格式')
        file_name = str(uuid.uuid4()) + '.' + last
        # image.name = file_name
        content = image.read()
        objectsname = 'uploads/taskimage/' + file_name
        avatar = OssFileUploading().assignurlfile(objectsname, content)

        TaskImage.objects.create(
            name=name,
            is_show=is_show,
            image=avatar
        )
        return APIResponse.success(message='OK')
  1. 阿里云oss官网:地址
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐