我真的很困惑,在使用亚马逊s3时键值应该是什么,这是我的代码。
<form action="http://bucket.s3.amazonaws.com" method="post" enctype="multipart/form-data">
<input type="text" name="key" value="{filename}" />
<input type="text" name="acl" value="public-read" />
<input type="text" name="content-type" value="text/plain" />
<input type="hidden" name="AWSAccessKeyId" value="Amazon Key" />
<input type="hidden" name="policy" value="ewogICJleHBpcmF0aW9uIjogIjIwMTItMDEtMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJpcIHsiYWNsIjogInB1YmxpYy1yZWFkIiB9LAogICAgWyJlcSIsICIka2V5IiwgIntmaWxlbmFtZX0iXSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJ0ZXh0LyJdLAogIF0KfQo=" />
<input type="hidden" name="signature" value="fGWi1jKU+hKZKbCIL1eD0=" />
<input name="file" type="file" />
<input name="submit" value="Upload" type="submit" />
</form>
好的所以我正在使用这项服务来生成我的政策等,因为我还没有弄清楚如何手动完成这项工作。
http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html
这适用于我上传的所有内容。但是当我上传我的文件时,他们总是调用{filename}而不是实际的文件名是picture.jpg。我知道这就是这条线。
<input type="text" name="key" value="{filename}" />
我希望它从我上传的实际文件名中取出该值。
我做错了什么很困惑。
我试过把它留空但我得到了这个错误。
InvalidArgumentUser键必须具有 长度大于0
我希望它能为我解决这个问题????
任何帮助请
答案 0 :(得分:6)
我知道你很久以前发过这个问题了,但有人可能有同样的问题。
键是您要上传的文件的名称和路径。
您可以在策略中设置关于密钥的条件,例如它应该从哪个开始。 您可以使用以下值保留原始文件名:$ {filename}(您缺少$)
示例强>: 保留原始文件名,但放在文件夹/ docs /
中表格:
<form action="http://yourbucketname.s3.amazonaws.com" method="post" enctype="multipart/form-data">
<input type="text" name="key" value="docs/${filename}" />
<input type="text" name="acl" value="public-read" />
<input type="text" name="content-type" value="text/plain" />
<input type="hidden" name="AWSAccessKeyId" value="<YourPublicKey>" />
<input type="hidden" name="policy" value="<Base64_encoded_your_policy>" />
<input type="hidden" name="signature" value="<HMAC SHA-1 of the policy>" />
<input name="file" type="file" />
<input name="submit" value="Upload" type="submit" />
</form>
政策为JSON
{"expiration": "2013-12-01T12:00:00.000Z",
"conditions": [
{"acl": "public-read-write" },
{"bucket": "yourbucketname" },
["starts-with", "$key", "docs/"],
["starts-with", "$Content-Type", "text/plain"],
]
}
您需要做什么:
答案 1 :(得分:2)
你只是在{filename}位前面错过了一个$符号。它应该是:
<input type="text" name="key" value="${filename}" />
有关详细信息,请参阅http://docs.amazonwebservices.com/AmazonS3/latest/dev/HTTPPOSTForms.html。
答案 2 :(得分:1)
您需要获取上传文件的名称并将其粘贴在{filename}
的位置答案 3 :(得分:1)
我以前没有提到过的东西是使用Amazon EC2 API提供的实用程序类。以下类包含获取策略字符串和签名的方法。如果您不需要设置额外的元字段或存储类,这是一个很好的帮助类:
com.amazonaws.services.ec2.util.S3UploadPolicy
答案 4 :(得分:0)
参数“key”是存储桶中上传文件的名称。您可以输入不同名称的浏览文件。
答案 5 :(得分:0)
可以使用基于表单的HTML上传来实现:article可以很好地解释它是如何实现的。阅读article之后,您可以使用下面提到的脚本来简化生活。
这是我用来生成策略的python脚本,它的签名和base64字符串。
IMP:确保policy.json文件位于同一目录
中
import base64
import hmac, hashlib
import os
AWS_SECRET_ACCESS_KEY = 'Your Access Key'
os.system('clear')
print "This policy generator is for key : " + AWS_SECRET_ACCESS_KEY
print "Make sure this is the correct key."
print "IMP: Please be consistent with the file policy.json small changes in space or newline can fail policy"
policy_document = file("policy.json",'rb').read()
policy = base64.b64encode(policy_document)
signature = base64.b64encode(hmac.new(AWS_SECRET_ACCESS_KEY, policy, hashlib.sha1).digest())
print
print "Policy (BASE64_POLICY to be inserted in HTML):-"
print policy
print
print "Signature:-"
print signature
print
这是我使用的相应policy.json文件:
{
"expiration": "2014-01-01T00:00:00.00Z",
"conditions": [
{"bucket": "BUCKET NAME" },
["starts-with", "$key", "PREFIX_IF_ANY"],
{"acl": "public-read" },
{"success_action_redirect": "http://REDIRECTED_URL" },
["starts-with", "$Content-Type", "CONTENT_TYPE"],
["content-length-range", 0, 1048576],
]
}
此代码的HTML表单如下:
<html>
<head>
<title>S3 POST Form</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="http://BUCKET_NAME.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="picbum/${filename}">
<input type="hidden" name="AWSAccessKeyId" value="AccessID">
<input type="hidden" name="acl" value="public-read">
<input type="hidden" name="success_action_redirect" value="http://REDIRECTED_URL">
<!-- Fill these HTML fields with data generated from python script -->
<input type="hidden" name="policy" value='BASE64_POLICY'>
<input type="hidden" name="signature" value="SIGNATURE_GENERATED">
<input type="hidden" name="Content-Type" value="CONTENT_TYPE">
<!-- 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>
</body>
</html>