最近,越來越多的公司采用第三方儲存來作為視頻,圖片的儲存工具。
國內的像七牛,阿里雲的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)