阿里云oss上传图片
在项目开发过程中,文件存储无非就是第一,存放到我们自己的服务器,但是这种方式有一个很大的弊端就是随着用户的增加,存放到服务器的数据或者图片越来越多,那么就会很占服务器的带宽,这样后期会很影响服务器的性能,导致卡顿,第二就是使用阿里云的oss数据存储,但是注意,阿里云的域名需要配置一下,不然我们后端返回给前端的url,前端拿到url后拉取图片,会报跨域错误,配置下就可以了,阿里云存储文件有两种方式:
·
在项目开发过程中,文件存储无非就是第一,存放到我们自己的服务器,但是这种方式有一个很大的弊端就是随着用户的增加,存放到服务器的数据或者图片越来越多,那么就会很占服务器的带宽,这样后期会很影响服务器的性能,导致卡顿,第二就是使用阿里云的oss数据存储,但是注意,阿里云的域名需要配置一下,不然我们后端返回给前端的url,前端拿到url后拉取图片,会报跨域错误,配置下就可以了,阿里云存储文件有两种方式:
- 当用户上传图片时,前端向我们后端去请求一个接口,后端向阿里云要一个token,然后后端把拿到的token返回给前端,前端拿到token后直接向oss请求保存图片
- 前端直接把图片以流的方式发送给后端,后端自己去向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')
- 阿里云oss官网:地址
更多推荐
已为社区贡献4条内容
所有评论(0)