最初にローカルファイルを作成してからs3サーバーにアップロードせずに、動的に生成されたファイルを直接Amazon s3にアップロードする実行可能な方法はありますか?私はpythonを使用しています。ありがとう
ローカルファイルに書き込むことなく、(requestsライブラリを使用して)画像をダウンロードしてs3にアップロードする例を次に示します。
import boto
from boto.s3.key import Key
import requests
#setup the bucket
c = boto.connect_s3(your_s3_key, your_s3_key_secret)
b = c.get_bucket(bucket, validate=False)
#download the file
url = "http://en.wikipedia.org/static/images/project-logos/enwiki.png"
r = requests.get(url)
if r.status_code == 200:
#upload the file
k = Key(b)
k.key = "image1.png"
k.content_type = r.headers['content-type']
k.set_contents_from_string(r.content)
Python標準ライブラリの BytesIO を使用できます。
from io import BytesIO
bytesIO = BytesIO()
bytesIO.write('whee')
bytesIO.seek(0)
s3_file.set_contents_from_file(bytesIO)
boto ライブラリの Key オブジェクトには、興味のあるメソッドがいくつかあります。
Set_contents_from_stringの使用例については、完全性のためにここに貼り付けたbotoドキュメントの Storing Data セクションを参照してください。
>>> from boto.s3.key import Key
>>> k = Key(bucket)
>>> k.key = 'foobar'
>>> k.set_contents_from_string('This is a test of S3')
boto
を使用していると思います。 boto
のBucket.set_contents_from_file()
はStringIO
オブジェクトを受け入れます。ファイルにデータを書き込むために記述したコードは、StringIO
に書き込むように簡単に調整できます。オブジェクト。または、文字列を生成する場合は、set_contents_from_string()
を使用できます。
ローカルファイルを作成せずに、S3にjsonファイルとして保存したいdictオブジェクトがありました。以下のコードは私のために働きました:
from smart_open import smart_open
with smart_open('s3://access-key:secret-key@bucket-name/file.json', 'wb') as fout:
fout.write(json.dumps(dict_object).encode('utf8'))
def upload_to_s3(url, **kwargs):
'''
:param url: url of image which have to upload or resize to upload
:return: url of image stored on aws s3 bucket
'''
r = requests.get(url)
if r.status_code == 200:
# credentials stored in settings AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, Host=AWS_Host)
# Connect to bucket and create key
b = conn.get_bucket(AWS_Bucket_Name)
k = b.new_key("{folder_name}/{filename}".format(**kwargs))
k.set_contents_from_string(r.content, replace=True,
headers={'Content-Type': 'application/%s' % (FILE_FORMAT)},
policy='authenticated-read',
reduced_redundancy=True)
# TODO Change AWS_EXPIRY
return k.generate_url(expires_in=AWS_EXPIRY, force_http=True)
保存時の暗号化が現在非常に望ましいデータ標準であることを考えると、smart_openはこのafaikをサポートしていません
smart_open
( https://pypi.org/project/smart_open/ )。私はそれをまさにそのために使用しました:S3で直接ファイルを書き込むこと。
同様の問題が発生していて、最終的な答えがあるかどうか疑問に思っていました。以下のコードでは、「starwars.json」はローカルに保存し続けますが、ループした各.jsonファイルをS3にプッシュし、ファイルがないためです。ローカルに保存されます。
for key, value in star_wars_actors.items():
response = requests.get('http:starwarsapi/' + value)
data = response.json()
with open("starwars.json", "w+") as d:
json.dump(data, d, ensure_ascii=False, indent=4)
s3.upload_file('starwars.json', 'test-bucket',
'%s/%s' % ('test', str(key) + '.json'))
Boto3の更新:
aws_session = boto3.Session('my_access_key_id', 'my_secret_access_key')
s3 = aws_session.resource('s3')
s3.Bucket('my_bucket').put_object(Key='file_name.txt', Body=my_file)