1. 程式人生 > 程式設計 >Django Admin 上傳檔案到七牛雲的示例程式碼

Django Admin 上傳檔案到七牛雲的示例程式碼

中文圈關於Django Admin 上傳檔案到七牛雲的資料和函式庫已經是2年前的了,國外的則都是關於AWS S3、Azure Storage一些國外的服務的。我根據Django的文件裡提到的儲存系統來實現上傳檔案到七牛雲的簡單功能。

在Django Admin的表單是根據資料模型生成的,其中檔案上傳由FileField和繼承FileField的ImageField來決定的,檔案上傳到靜態檔案目錄,資料庫儲存相對路徑。實現上傳檔案到七牛雲我們是根據FileField的storage引數來實現的。

models.ImageField(storage=MyStorage())

storage引數需要傳入一個實現抽象類Storage的物件。

下面引用文件的原句

你自定義的儲存系統必須為Django.core.files.storage.Storage的一個子類:

from django.conf import settings
from django.core.files.storage import Storage

class MyStorage(Storage):
  def __init__(self,option=None):
    if not option:
      option = settings.CUSTOM_STORAGE_OPTIONS
    ...

然後重寫全部的抽象方法,具體的可以去官網文件看。我們這裡先不繼承Storage。我在Django的核心裡找到了已經繼承了的FileSystemStorage,我想只要繼承Django標準的檔案管理類

FileSystemStorage,過載_save部分變成上傳到七牛雲不就好了。說幹就幹。

class MyStorage(FileSystemStorage):
  def _save(self,name,content):
    # 延續原方法的寫法
    filename = name.replace('\\','/')
    # 將檔案傳入封裝好的物件裡
    q = Qiniu()
    q.upload_stream(filename,content.file.getvalue())
    return filename

我簡單寫一下封裝的Qiniu上傳的類

class Qiniu():
  def __init__(self):
    self.access_key = settings.QINIU_ACCESS_KEY
    self.secret_key = settings.QINIU_SECRET_KEY
    # 要上傳的空間
    self.bucket_name = settings.QINIU_BUCKET_NAME
    # 構建鑑權物件
    self.auth = Auth(self.access_key,self.secret_key)
    
  def get_token(self,key):
    """

    :param key: 檔名
    :return: 上傳令牌
    """
    policy = {
      'scope': settings.QINIU_BUCKET_NAME,'mimeLimit': 'image/jpeg;image/png','deadline': 3600
    }
    # 3600為token過期時間,秒為單位。3600等於一小時
    token = self.auth.upload_token(self.bucket_name,key,3600,policy)
    return token
    
  def upload_stream(self,filename,stream_data):
    """

    :param filename: 檔名
    :param stream_data: 二進位制資料
    :return: 無
    """
    # 上傳後儲存的檔名
    key = filename
    # 生成上傳 Token,可以指定過期時間等
    token = self.auth.upload_token(self.bucket_name,3600)
    # 要上傳檔案的本地路徑
    # localfile = file_path
    ret,info = put_data(up_token=token,key=key,data=stream_data)
    assert ret['key'] == key
    # assert ret['hash'] == etag_stream(stream_data)

參考資料:

https://docs.djangoproject.co ...

總結

到此這篇關於Django Admin 上傳檔案到七牛雲的文章就介紹到這了,更多相關Django Admin 上傳檔案到七牛雲內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!