2012-02-23 21 views
3

私は本当にここにこだわっています。djangoからS3に直接アップロード

私はDjangoフォームからS3に直接アップロードできるようにします。 これは、表示画像を保持するために使用されます。

私はこれに続く:http://django-storages.readthedocs.org/en/latest/backends/amazon-S3.html

を残念ながら私はいくつかの理由のsettings.pyする

DEFAULT_FILE_STORAGE = 'storages.backends.s3.S3Storage' 

を追加することで動けなくなります。 djangoは私が行った変更を認識しません。 (私はDEFAULT_FILE_STORAGE =「asdsfsdfsdf」にそれを変更し、それもエラーを与えていない。 面白いことは、ジャンゴ・ストレージは、私が探している機能を持っている場合は私も知っていないということである。

+0

その場所にスクリプトがありますか?それは実行しようとするまでエラーを出さないでしょう。あなたがそのようなスクリプトを持っているなら、もっとコードを投稿できますか? – ABS

+0

ちょうどこの正確な問題に遭遇しました - あなたはこれを解明しましたか? – Andrew

+0

私は、同じdjango-store appを使っていました。彼がリンクしている指示には設定が表示され、変更が反映されるようにdjangoシェルを使用するよう指示されます。しかし、何も変更されず、djangoは通常のデフォルトのファイルストレージを報告します。私が解決すれば、私はここで更新します。 – Guerry

答えて

2

であなたのウェブサーバーを迂回してS3に直接アップロードするには、ブラウザを介して事前に許可されたURLに直接投稿する必要があります。アマゾンからthis articleを読んで、どのように動作する必要があるか説明してください。

私は何も知らないこれはあなたのためにジャンゴでこれを行いますが、あなた自身もリクエストをするのは難しくありません。また、ブラウザからの実際の投稿にはuploadifyのようなものを使用することができ、ちょうどそれに適切なURLを与える必要があります。

2

これはそれほど難しくありません。手順は、ポリシー文書を生成して署名し、その署名を使用してファイルをS3にPOSTすることです。私はこれを行う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> 
4

Here's私は一度書いた実施例、django-s3uploadを。