Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在heroku上使用python中的boto3将文件上载到s3?_Python_Heroku_Amazon S3_Boto3 - Fatal编程技术网

如何在heroku上使用python中的boto3将文件上载到s3?

如何在heroku上使用python中的boto3将文件上载到s3?,python,heroku,amazon-s3,boto3,Python,Heroku,Amazon S3,Boto3,所有在线示例似乎都使用boto。我可以使用什么代码使用boto3将文件上载到s3 我试图使用官方文档中的代码,但我收到一个错误,版本4身份验证失败。根据将密钥放入密钥文件中,然后使用以下代码: import boto3 s3 = boto3.resource(service_name='s3', region_name='REGION_NAME') data = open('PATH_TO_FILE_ON_DISK', 'rb') s3.B

所有在线示例似乎都使用boto。我可以使用什么代码使用boto3将文件上载到s3


我试图使用官方文档中的代码,但我收到一个错误,版本4身份验证失败。

根据将密钥放入密钥文件中,然后使用以下代码:

       import boto3
       s3 = boto3.resource(service_name='s3', region_name='REGION_NAME')
       data = open('PATH_TO_FILE_ON_DISK', 'rb')
       s3.Bucket('BUCKET_NAME').put_object(Key='FILENAME_ON_S3', Body=data)

官方文档没有明确说明区域名称是必需的,否则可能会出现错误,并且无法在heroku上存储该区域的配置文件。它必须包含在资源调用中。

仅供参考以下是如何解决所有新区域使用v4身份验证的问题-在配置文件中设置签名版本:

--- .aws/config ---
[default]
output = json

[profile myprofile]
region = REGION_NAME
s3=
  signature_version = s3
#  addressing_style = path

--- .aws/credentials ---
[myprofile]
aws_access_key_id = <access-key>
aws_secret_access_key = <secret-key>

--- python ---
import boto3

session = boto3.Session(profile_name='myprofile')
s3 = session.resource('s3')
with open('PATH_TO_FILE_ON_DISK', 'rb') as data:
    s3.Object('BUCKET_NAME', 'FILENAME_ON_S3').put(Body=data)

最近,Heroku发布了一篇关于将文件上传到Heroku中S3的好文章

根据说明,您需要在Heroku应用程序配置变量中指定AWS凭据和Bucket名称

为了让您的应用程序访问AWS凭据以签署上载请求,需要在Heroku中将其作为配置变量添加:

除AWS访问凭据外,设置目标S3存储桶的名称:


注意:如果在部署之前在本地进行测试,请记住也要将凭据添加到本地计算机的环境中。上面描述了如何使用配置文件进行配置。

由于heroku无法访问您的,您必须使用。然后,您可以使用任何一种

从操作系统导入getenv
进口boto3
boto_kwargs={
“aws访问密钥id”:getenv(“aws访问密钥id”),
“aws_secret_access_key”:getenv(“aws_secret_access_key”),
“地区名称”:getenv(“AWS地区”),
}
s3_client=boto3.Session(**boto_kwargs.client(“s3”)
s3_client.upload_fileobj(,)

请尝试搜索网络。对于子孙后代来说,官方文档遗漏了一个非常关键的点,就像文档经常做的那样。这就是本文的目的。哪一点至关重要?似乎正好提供了您要查找的内容。如果您不幸选择了一个区域(如us-east-2,其中默认值不起作用),则需要region_name='region_name')。可以在配置文件中设置
region
(如快速启动中所述)而
区域名称
会话
资源
的文档中有明确的解释。顺便说一句,您可能希望在
.aws/config
中浏览配置文件,并使用
会话
对象。这并没有回答“新语法是什么?”的问题。它以什么方式没有回答?如果您复制并粘贴该代码,它将非常有效。不管怎样,没关系。我只需要填充一些空间,因为我已经搜索这段代码将近4天了。文档不清楚。好的,我不打算就此争论,我将删除我的否决票。我的投票被锁定,我无法删除,因此请对您的答案进行一些编辑。
正文
需要是数据(例如
“这是我的数据”
)或文件类型对象,例如
打开(“磁盘上文件的路径”)
。您的示例只是一个对象,其中包含字符串
PATH\u TO\u FILE\u(在磁盘上)
,而不是文件内容。除非您知道隐藏的功能,否则配置文件在heroku上不起作用
s3.Object('BUCKET_NAME', 'FILENAME_ON_S3').upload_file('PATH_TO_FILE_ON_DISK')
$ heroku config:set AWS_ACCESS_KEY_ID =xxx AWS_SECRET_ACCESS_KEY =yyy
Adding config vars and restarting app... done, v21
AWS_ACCESS_KEY_ID     => xxx
AWS_SECRET_ACCESS_KEY => yyy
heroku config:set S3_BUCKET = zzz
Adding config vars and restarting app... done, v21
S3_BUCKET     => zzz
from os import getenv

import boto3

boto_kwargs = {
    "aws_access_key_id": getenv("AWS_ACCESS_KEY_ID"),
    "aws_secret_access_key": getenv("AWS_SECRET_ACCESS_KEY"),
    "region_name": getenv("AWS_REGION"),
}

s3_client = boto3.Session(**boto_kwargs).client("s3")

s3_client.upload_fileobj(<f>, <bucket_name>, <object_name>)