美文网首页
Django使用第三方存储服务器

Django使用第三方存储服务器

作者: ___大鱼___ | 来源:发表于2019-02-18 18:39 被阅读12次

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的后缀名加以处理。
个人博客: https://www.1117.work
参考文档: http://yshblog.com/blog/172

相关文章

网友评论

      本文标题:Django使用第三方存储服务器

      本文链接:https://www.haomeiwen.com/subject/cejzeqtx.html