2011-01-25 3 views
3

Я действительно смущен относительно того, какое ключевое значение должно быть при использовании amazon s3 здесь - это мой код.Amazon S3 Загрузить Что делает Key do

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

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

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

У меня была аналогичная проблема, и я решил ее, как [это] [1] [1]: http://stackoverflow.com/a/17623622/2155074 – sanvj

ответ

1

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

+0

Привет я попробовал, что с помощью но ничего не показывает, как бы вы предложили сделать это. – iSimpleDesign

0

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

1

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

com.amazonaws.services.ec2.util.S3UploadPolicy 
6

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

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

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

Пример: Keep оригинальное имя файла, но поместить в папку/документы/

Форма :

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

Что вам нужно сделать:

  • Заменить Yourbucketname в действия и политика-Json
  • Base64 закодировать политик
  • Установить политику в стоимости полиса формы
  • Замените ваш AWSAccessKeyId в виде
  • Подписать закодированную политику с вашим Secret Access Key с использованием HMAC SHA-1
  • Обнаружить подпись в форме подписи под торговой марки
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>