Django用阿里云存储oss进行存储静态文件
1. 首先登陆阿里云购买阿里云oss第三方存储库。购买之后获得密钥等信息。
接着,安装oss2库,该库是Python对应oss的操作库。
pip install oss2
再安装或下载Django OSS的Storage库。这些库是继承Django的Storage类,并重写相关方法。Django的Stroage是管理上传文件的存储。如何自定义Storage可参考
执行如下命令,安装Django-Aliyun-OSS2-Storage:
pip install django-aliyun-oss2-storage
3. 配置Django的setting.py
# 使用OSS存储文件
DEFAULT_FILE_STORAGE = 'aliyun_oss2_storage.backends.AliyunMediaStorage'
# 配置OSS信息
ACCESS_KEY_ID = "xxxxxxxxxxx"
ACCESS_KEY_SECRET = "xxxxxxxxxxx"
END_POINT = "oss-cn-shenzhen.aliyuncs.com" # OSS存储节点
BUCKET_NAME = "xxx"
BUCKET_ACL_TYPE = "public-read" # private, public-read, public-read-write
ALIYUN_OSS_CNAME = "" # 使用自有域名 没有的可以忽略
4.由于上传的文件需要开放被用户下载,BUCKET_ACL_TYPE设置为公共的。若你的静态文件也需要上传到OSS中,设置如下:
# 设置上传的静态文件
STATICFILES_STORAGE = 'aliyun_oss2_storage.backends.AliyunStaticStorage'
5.设置无误后,重启Django即可使用。上传文件将自动上传到OSS中。
上面提到我要修改里面的源码。因为发现上传的文件在下载时的文件名是一串乱码,不是上传时的文件名。这个需要设置一些header信息,可参考
打开该包的源码文件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)
这样设置,点击文件链接,即可下载并且下载文件名是上传的文件名。若你不是什么类型文件都需要这么处理,可以判断filename的后缀名加以处理。
网友评论