Amazon S3 Upload Что делает Key - PullRequest
3 голосов
/ 25 января 2011

Я действительно смущен тем, какое значение ключа должно быть при использовании amazon 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

Это работает и дает мне все для загрузки.Но когда я загружаю свои файлы, они всегда вызывают {имя_файла}, а не имя файла на самом деле говорит picture.jpg.Я знаю, что это до этой строки.

<input type="text" name="key" value="{filename}" />

Я хочу, чтобы это значение было взято из фактически загружаемого мной имени файла.

Что я делаю неправильно, очень запутано.

Я пытался оставить это поле пустым, но я получаю эту ошибку.

Ключ InvalidArgumentUser должен иметь длину больше 0

Я хочу, чтобы это сработало длямне ????

Любая помощь, пожалуйста

Ответы [ 6 ]

6 голосов
/ 19 августа 2012

Я знаю, что вы задавали этот вопрос очень давно, но у кого-то может быть такой же вопрос.

Ключ - это имя и путь к файлу, который вы загружаете.

Вы можете установить в своей политике условия относительно ключа, например, с чего он должен начинаться. Вы можете сохранить оригинальное имя файла, используя значение: $ {имя_файла} (вам не хватает $)

Пример : Сохраните оригинальное имя файла, но поместите в папку / 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 action и Policy-Json
  • Base64 кодировать политику
  • Установить политику в виде значения политики
  • Замените AWSAccessKeyId на форму
  • Подпишите закодированную политику с помощью Секретного ключа доступа , используя HMAC SHA-1
  • Установить подпись в виде значения подписи
2 голосов
/ 26 июня 2012

Вы просто пропускаете знак $ перед битом {filename}. Должно быть:

<input type="text" name="key" value="${filename}" />

См. http://docs.amazonwebservices.com/AmazonS3/latest/dev/HTTPPOSTForms.html для получения дополнительной информации.

1 голос
/ 08 сентября 2011

Что-то, чего я раньше не упоминал, - это использование служебного класса, предоставляемого API Amazon EC2. Следующий класс содержит методы для получения строки политики и подписи. Это отличный вспомогательный класс, если вам не нужно устанавливать дополнительные мета-поля или класс хранения:

com.amazonaws.services.ec2.util.S3UploadPolicy
1 голос
/ 25 января 2011

Вам нужно взять имя загруженного файла и вставить его вместо {имя_файла}

0 голосов
/ 19 сентября 2013

Это можно сделать, используя загрузку HTML на основе форм: Эта статья хорошо объясняет, как это возможно. После прочтения статьи вы можете использовать мои сценарии, упомянутые ниже, чтобы облегчить жизнь.

Вот скрипт 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>
0 голосов
/ 12 мая 2011

Параметр «ключ» - это имя загруженного файла в корзине. Вы можете поставить другое имя просматриваемого файла.

...