我需要允许用户将内容直接上传到Amazon S3。此表单有效:
<form action="https://me.s3.amazonaws.com/" method="post" enctype='multipart/form-data' class="upload-form">{% csrf_token %}
<input type="hidden" name="key" value="videos/test.jpg">
<input type="hidden" name="AWSAccessKeyId" value="<access_key>">
<input type="hidden" name="acl" value="public-read">
<input type="hidden" name="policy" value="{{policy}}">
<input type="hidden" name="signature" value="{{signature}}">
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="submit" value="Upload" name="upload">
</form>
在函数中,我定义了策略和签名。但是,我需要将两个变量传递给表单 - Content-Type
和Key
,只有在用户按下上传按钮时才会知道。因此,我需要在POST请求之后但在重定向到Amazon之前将这两个变量传递给模板。
有人建议我使用urllib来做到这一点。我尝试过以下方式,但我不断得到一个难以理解的HTTPError。这就是我目前所拥有的:
if request.method == 'POST':
# define the variables
urllib2.urlopen("https://me.amazonaws.com/",
urllib.urlencode([('key','videos/test3.jpg'),
('AWSAccessKeyId','<access_key'),
('acl','public-read'),
('policy',policy),
('signature',signature),
('Content-Type',content_type),
('file',file)]))
我也尝试过硬编码所有值而不是使用变量但仍然得到相同的错误。我做错了什么,我需要更改什么才能将表单重定向到亚马逊,所以内容可以直接上传到亚马逊?
答案 0 :(得分:1)
我建议观看表单与Firebug一起使用,启用并设置为“网络”标签。
完成POST后,单击其[+]图标展开,研究标题,POST,响应标签,看看你缺少什么和/或做错了。
接下来将此脚本与Django分开并放入一个独立的文件中。一次添加一件东西并重新测试直到它工作。下面的行应该可以提高脚本的可见性。
import httplib
httplib.HTTPConnection.debuglevel = 1
我自己尝试使用urllib,但由于我在AWS上没有帐户,因此我得到的不仅仅是获得400 Bad Request响应。似乎是一个好兆头,可能我只需要有效的主机和关键参数等。