我可以直接在s3上传图像而不保存在本地文件夹中吗?

时间:2018-05-29 11:38:52

标签: python amazon-web-services amazon-s3 boto3

我正在使用diff函数从set_contents_from_file()等路径上传图像。但他们从路径中获取图像然后上传它们。是否有任何函数直接上传imageObject直接从python代码上传?

1 个答案:

答案 0 :(得分:1)

是的,S3接受通过特制和预授权的HTML POST表单上传。您可以在任何网页中包含这些表单,以允许您的网站访问者仅使用标准Web浏览器向您发送文件。

查看S3 POST Upload

Bottomline,它来创建一个这样的表单:

<html>
  <head>
    <title>S3 POST Form</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <form action="https://s3-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
      <input type="hidden" name="key" value="uploads/${filename}"> <input type="hidden" name="AWSAccessKeyId" value="YOUR_AWS_ACCESS_KEY">
      <input type="hidden" name="acl" value="private">
      <input type="hidden" name="success_action_redirect" value="http://localhost/">
      <input type="hidden" name="policy" value="YOUR_POLICY_DOCUMENT_BASE64_ENCODED">
      <input type="hidden" name="signature" value="YOUR_CALCULATED_SIGNATURE">
      <input type="hidden" name="Content-Type" value="image/jpeg">
      <!-- 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>

之后,添加政策文件

  

S3 POST表单包含一个授权表单和的策略文档   对可以上传的文件施加限制。当S3收到一个   通过POST表单文件,它将检查策略文档和签名   确认表单是由被允许的人创建的   将文件存储在目标S3帐户中。

{"expiration": "2009-01-01T00:00:00Z",
  "conditions": [ 
    {"bucket": "s3-bucket"}, 
    ["starts-with", "$key", "uploads/"],
    {"acl": "private"},
    {"success_action_redirect": "http://localhost/"},
    ["starts-with", "$Content-Type", ""],
    ["content-length-range", 0, 1048576]
  ]
}

最后,签署您的POST请求

  

要完成S3 POST表单,您必须签名以向S3证明   你实际创建了表单。如果您没有正确签署表格,   或者如果其他人在签署后尝试修改您的表格,   该服务将无法对其进行授权,并将拒绝上传。

import base64
import hmac, hashlib

policy = base64.b64encode(policy_document)

signature = base64.b64encode(hmac.new(AWS_SECRET_ACCESS_KEY, policy, hashlib.sha1).digest())