最近,越来越多的公司采用第三方储存来作为视频,图片的储存工具。
国内的像七牛,阿里云的OSS,国外的像亚马逊的S3,微软的azure都是非常有名的第三方储存。
下面以阿里的OSS为例,来介绍第三储存的使用:
1.安装python对OSS操作的模块
pip install oss2
2.再安装python对OSS储存的模块
pip install django-aliyun-oss2-storage
3.设置settings.py文件
# 使用OSS存储文件 DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage' # 配置OSS信息 ACCESS_KEY_ID = "xxxxxxxxxxx" ACCESS_KEY_SECRET = "xxxxxxxxxxx" END_POINT = "oss-cn-shanghai.aliyuncs.com" # OSS存储节点 BUCKET_NAME = "xxx" BUCKET_ACL_TYPE = "public-read" # private, public-read, public-read-write
MEDIA_ROOT是媒体文件的上传位置根目录,由于设置了BUCKET_NAME,一般在这个bucket中。所以设置为空字符串。
文件自然上传到Django模版的FileField字段设置的upload_to位置。
MEDIA_URL是获取媒体文件的链接前缀,可根据自己的oss文件链接位置添加。
由于上传的文件需要开放被用户下载,BUCKET_ACL_TYPE设置为公共的。若你的静态文件也需要上传到OSS中,设置如下:
# 设置上传的静态文件 STATICFILES_STORAGE = 'aliyun_oss2_storage.backends.AliyunStaticStorage'
解决文件名称乱码问题:
打开该包的源码文件backends.py,找到AliyunBaseStorage类的_save方法。修改如下:
def _save(self, name, content): # 获得文件名 filename = str(content) # 设置header headers = {} headers['Content-Type'] = 'application/octet-stream' headers['Content-Disposition'] = 'attachment; filename=%s' % filename # get oss' target name name = self._get_target_name(name) content.open() content_str = b''.join(chunk for chunk in content.chunks()) self.bucket.put_object(name, content_str, headers=headers) # add headers content.close() return self._clean_name(name)