2012-08-31 43 views
0

我有一個問題(使用csrf)使用POST執行直接上傳到S3。如何通過POST繞過CRFSMIDDLEWARE錯誤到Amazon S3?

下面是代碼:

<form action="https://mymediaurl/" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="key" value="uploads/${filename}"> 
    <input type="hidden" name="AWSAccessKeyId" value="{{ access_key }}"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="http://localhost/"> 
    <input type="hidden" name="policy" value="{{ policy }}"> 
    <input type="hidden" name="signature" value="{{ signature }}"> 
    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <!-- Include any additional input fields here --> 

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

以下是錯誤:

<form action="https://mymediaurl/" method="post" enctype="multipart/form-data"> 
    <div style='display:none;'><input type='hidden' id='csrfmiddlewaretoken' name='csrfmiddlewaretoken' value='123412341234' /></div> 
    <div style='display:none;'><input type='hidden' id='csrfmiddlewaretoken' name='csrfmiddlewaretoken' value='123412341234' /></div> 
    <input type="hidden" name="key" value="uploads/${filename}"> 
    <input type="hidden" name="AWSAccessKeyId" value="ASFDFDSF"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="http://localhost/"> 
    <input type="hidden" name="policy" value="asdhfkajewhlfawe"> 
    <input type="hidden" name="signature" value="asdfasdfasdf"> 
    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <!-- Include any additional input fields here --> 

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

我曾嘗試加入csrfmiddlewaretoken我的政策:

包括捷克斯洛伐克
<Code>AccessDenied</Code> 
<Message> 
    Invalid according to Policy: Extra input fields: csrfmiddlewaretoken 
</Message> 

源代碼文件,但這不起作用。有沒有人遇到這個問題,並找到解決方案?我搜索了高和低,但似乎無法找到這個具體問題的答案。

運行Django 1.3.1這個項目,如果該事項..

+0

爲什麼不使用s3boto存儲或django-storage與AWS有很好的集成?這樣,您可以將AWS密鑰等設置爲設置文件,而不必以任何形式對其進行處理 – karthikr

+0

@karthikr感謝您的答覆。我現在實際上使用s3boto,但我想嘗試跳過本地存儲並將這些文件直接發送到s3。該文件都在200 + MB附近,我不想打我的服務器。 – Lonoshea

+1

確保您的政策正確格式化了「csrfmiddlewaretoken」?具體來說,我想到這裏提到的'$':https://forums.aws.amazon.com/message.jspa?messageID=188006 – Christopher

回答

0

回答我自己與克里斯托弗的評論幫助的問題。

這裏是我的政策文件:

{"expiration": "2014-01-01T00:00:00Z", 
"conditions": [ 
    {"bucket": "media.somehost.com"}, 
    ["starts-with", "$key", "uploads/"], 
    ["starts-with", "$csrfmiddlewaretoken", ""], 
    {"acl": "private"}, 
    {"success_action_redirect": "http://localhost/"}, 
    ["starts-with", "$Content-Type", ""], 
    ["content-length-range", 0, 1048576] 
] 

我只需要在csrfmiddlewaretoken用正確的格式添加到我的政策。