Django Boto3: NoCredentialsError -- 找不到凭证

5

我正在尝试在我的Django项目中使用boto3将文件上传到Amazon S3。凭据已在settings.py中定义:

AWS_ACCESS_KEY = xxxxxxxx
AWS_SECRET_KEY = xxxxxxxx
S3_BUCKET = xxxxxxx

views.py中:
import boto3

s3 = boto3.client('s3')
path = os.path.dirname(os.path.realpath(__file__))
s3.upload_file(path+'/myphoto.png', S3_BUCKET, 'myphoto.png')

系统报错提示“无法找到凭证”。我有两个问题:
(a) 看起来我应该创建一个凭证文件~/.aws/credentials。但在django项目中,我应该把它放在哪里?
(b) s3方法upload_file将文件路径/名称作为其第一个参数。是否可能提供通过表单输入元素<input type="file" name="fileToUpload">获取的文件流?
1个回答

1
这是我用于直接上传的方法,希望能对您有所帮助。
import boto
from boto.exception import S3CreateError
from boto.s3.connection import S3Connection

conn = S3Connection(settings.AWS_ACCESS_KEY,
                    settings.AWS_SECRET_KEY,
                    is_secure=True)
try:
    bucket = conn.create_bucket(settings.S3_BUCKET)
except S3CreateError as e:
    bucket = conn.get_bucket(settings.S3_BUCKET)

k = boto.s3.key.Key(bucket)
k.key = filename
k.set_contents_from_filename(filepath)

对于(a)我不太确定,但Django在文件管理方面非常灵活。

对于(b),你还可以签署上传并直接从客户端上传以减少带宽使用,这相当巧妙和安全。您需要使用一些JavaScript来管理上传。如果您想要详细信息,我可以在此处包含它们。


1
非常感谢。它起作用了。但是我注意到你使用了 boto 而不是 boto3。它们实际上有很大的区别吗?还有一个问题:如果我通过表单输入 <input type="file" name="fileToUpload"> 获取文件,我该怎么办? - Randy Tang
1
这里使用的是boto,而不是boto3。 - Trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接