簡體   English   中英

從django直接上傳到S3

[英]Upload directly to S3 from django

我真的被困在這里了。

我希望能夠從django表單直接上傳到S3。 這將用於保存顯示圖片。

我跟着這個: http//django-storages.readthedocs.org/en/latest/backends/amazon-S3.html

但不幸的是,我不得不加入

DEFAULT_FILE_STORAGE = 'storages.backends.s3.S3Storage'

由於某種原因到settings.py。 django甚至不承認我所做的改變。 (我把它更改為DEFAULT_FILE_STORAGE ='asdsfsdfsdf',它甚至沒有給出錯誤。有趣的是,我甚至不知道django-storages是否具有我正在尋找的功能。

這是我曾經寫過一個工作示例, django-s3upload

這不是太難。 步驟是生成策略文檔,對其進行簽名,然后使用該簽名將文件POST到S3。 我寫了一個名為sbit3的小應用程序。 看看這里: https//github.com/victortrac/sbit3/blob/master/server/sbit3.py ,特別是PostHandler類:

class PostHandler(tornado.web.RequestHandler):
    def _generate_policy_doc(self, conditions, expiration=None):
        if not expiration:
            # Sets a policy of 15 minutes to upload file
            expiration = datetime.datetime.utcnow() + datetime.timedelta(minutes=15)
        conditions = [ { "bucket" : conditions["bucket"] },
                       [ "starts-with", "$key", "uploads/"],
                       { "acl" : conditions["acl"] },
                       { "success_action_redirect" : conditions["success_action_redirect"] } ]
        conditions_json = json.dumps({ "expiration" : expiration.strftime("%Y-%m-%dT%H:%M:%SZ"),
                                       "conditions" : conditions })
        logging.debug("Policy doc generated: {0}".format(conditions_json))
        return base64.b64encode(conditions_json)

    def _sign_policy(self, policy):
        signature = base64.b64encode(hmac.new(settings.aws_secret_key, policy, hashlib.sha1).digest())
        return signature

    def get(self, expiration):
        try:
            expiration = int(expiration)
            # Set max expiration to 7200 minutes (5 days)
            if not 0 < expiration < 7200:
                raise tornado.web.HTTPError(403)
            _expireTimestamp = datetime.datetime.utcnow() + datetime.timedelta(minutes=expiration)
        except ValueError:
            raise tornado.web.HTTPError(403)

        # Associate _uuid to expiration in sdb

        _uuid = uuid.uuid4().hex
        sdb_conn.add_item(_uuid, expireTimestamp=_expireTimestamp)

        conditions = { "bucket" : settings.bucket,
                       "acl" : settings.acl,
                       "success_action_redirect" : settings.site_url + "/f/" + _uuid }
        policy_document = self._generate_policy_doc(conditions)
        signature = self._sign_policy(policy_document)

        self.render("post.html", conditions=conditions,
                                 aws_access_id=settings.aws_access_id,
                                 policy_document=policy_document,
                                 signature=signature)

查看設置表單的post.html

<form action="https://{{ conditions["bucket"] }}.s3.amazonaws.com" method="post" enctype="multipart/form-data">
  <input type="hidden" name="key" value="uploads/${filename}">
  <input type="hidden" name="AWSAccessKeyId" value="{{ aws_access_id }}"> 
  <input type="hidden" name="acl" value="{{ conditions["acl"] }}"> 
  <input type="hidden" name="success_action_redirect" value="{{ conditions["success_action_redirect"] }}">
  <input type="hidden" name="policy" value="{{ policy_document }}">
  <input type="hidden" name="signature" value="{{ signature }}">

  File to upload to S3: 
  <input name="file" type="file"> 
  <br> 
  <input type="submit" value="Upload File to S3"> 
</form> 

要直接上傳到S3(繞過您的網絡服務器),您需要直接通過瀏覽器發布到預先授權的網址。 閱讀亞馬遜的這篇文章 ,解釋它是如何工作的。

我不知道任何會在django中為你做這件事的事情,但要自己提出這個要求並不太難。 你也可以使用像uploadify這樣的東西從瀏覽器進行實際發布,你只需要給它正確的網址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM