亚马逊S3上传什么键做

时间:2011-01-25 13:40:08

标签: file-upload amazon-s3

我真的很困惑,在使用亚马逊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

我希望它能为我解决这个问题????

任何帮助请

6 个答案:

答案 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"],
]
}

您需要做什么:

  • 替换for for action和Policy-Json
  • 中的Yourbucketname
  • Base64对政策进行编码
  • 在表单策略值中设置策略
  • 将<{3}}替换为
  • 形式
  • 使用AWSAccessKeyId
  • 在您的Secret Access Key上签署已编码的政策
  • 在表单签名值中设置签名

答案 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>