Saya perlu menulis kode dengan python yang akan menghapus file yang diperlukan dari ember Amazon s3. Saya dapat terhubung ke bucket Amazon s3, dan juga untuk menyimpan file, tetapi bagaimana cara menghapus file?
Saya perlu menulis kode dengan python yang akan menghapus file yang diperlukan dari ember Amazon s3. Saya dapat terhubung ke bucket Amazon s3, dan juga untuk menyimpan file, tetapi bagaimana cara menghapus file?
Jawaban:
Menggunakan boto3
(saat ini versi 1.4.4) menggunakan S3.Object.delete()
.
import boto3
s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()
s3.Object('existing-bucket', 'bogus-key').delete()
dan lihat apa yang terjadi. Coba juga s3.Object('bogus-bucket', 'bogus-key').delete()
.
your-key
sini berarti nama file sebenarnya di your-bucket
S3?
menemukan satu cara lagi untuk melakukannya dengan menggunakan boto:
from boto.s3.connection import S3Connection, Bucket, Key
conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)
b = Bucket(conn, S3_BUCKET_NAME)
k = Key(b)
k.key = 'images/my-images/'+filename
b.delete_key(k)
for x in b.list(): b.delete_key(x.key)
bucket.list()
Bucket
dan Key
juga. Seperti dalam:from boto.s3.connection import S3Connection, Bucket, Key
>>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connection
tolong perbarui jawaban untuk boto3
Menggunakan Python boto3 SDK (dan mengasumsikan kredensial disiapkan untuk AWS), berikut ini akan menghapus objek yang ditentukan dalam keranjang:
import boto3
client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
Selamat datang di tahun 2020 ini jawabannya dengan Python / Django:
from django.conf import settings
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")
Butuh waktu lama bagi saya untuk menemukan jawabannya dan sesederhana ini.
Cobalah untuk mencari metode yang diperbarui , karena Boto3 dapat berubah dari waktu ke waktu. Saya menggunakan my_bucket.delete_objects () :
import boto3
from boto3.session import Session
session = Session(aws_access_key_id='your_key_id',
aws_secret_access_key='your_secret_key')
# s3_client = session.client('s3')
s3_resource = session.resource('s3')
my_bucket = s3_resource.Bucket("your_bucket_name")
response = my_bucket.delete_objects(
Delete={
'Objects': [
{
'Key': "your_file_name_key" # the_name of_your_file
}
]
}
)
Melalui antarmuka yang mana? Menggunakan antarmuka REST, Anda cukup mengirim delete :
DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue
Melalui antarmuka SOAP :
<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01">
<Bucket>quotes</Bucket>
<Key>Nelson</Key>
<AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId>
<Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
<Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
</DeleteObject>
Jika Anda menggunakan pustaka Python seperti boto , itu harus mengekspos fitur "hapus", seperti delete_key()
.
DELETE
panggilan melalui antarmuka REST. Jadi ya, meskipun namanya "delete_key" (yang saya setujui tidak jelas), itu benar-benar menghapus objek yang direferensikan oleh kunci tersebut.
Untuk saat ini saya telah menyelesaikan masalah dengan menggunakan utilitas Linux s3cmd . Saya menggunakannya seperti ini dengan Python:
delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)
Ini berhasil bagi saya mencobanya.
import boto
import sys
from boto.s3.key import Key
import boto.s3.connection
AWS_ACCESS_KEY_ID = '<access_key>'
AWS_SECRET_ACCESS_KEY = '<secret_access_key>'
Bucketname = 'bucket_name'
conn = boto.s3.connect_to_region('us-east-2',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
is_secure=True,
calling_format = boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.get_bucket(Bucketname)
k = Key(bucket)
k.key = 'filename to delete'
bucket.delete_key(k)
Anda dapat melakukannya menggunakan aws cli: https://aws.amazon.com/cli/ dan beberapa perintah unix.
perintah cli aws ini harus berfungsi:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
jika Anda ingin menyertakan sub-folder, Anda harus menambahkan tanda --recursive
atau dengan perintah unix:
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I% <your_os_shell> -c 'aws s3 rm s3:// <your_bucket_name> /% $1'
penjelasan:
jika Anda mencoba untuk menghapus file menggunakan konsol host lokal Anda sendiri, maka Anda dapat mencoba menjalankan skrip python ini dengan asumsi bahwa Anda telah menetapkan id akses dan kunci rahasia Anda di sistem
import boto3
#my custom sesssion
aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
client=aws_m.client('s3')
#list bucket objects before deleting
response = client.list_objects(
Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
print(x.get("Key",None));
#delete bucket objects
response = client.delete_object(
Bucket='your-bucket-name',
Key='mydocs.txt'
)
#list bucket objects after deleting
response = client.list_objects(
Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
print(x.get("Key",None));
Yang berikut ini bekerja untuk saya (berdasarkan contoh untuk model Django, tetapi Anda dapat menggunakan cukup banyak kode delete
metode itu sendiri).
import boto3
from boto3.session import Session
from django.conf import settings
class Video(models.Model):
title=models.CharField(max_length=500)
description=models.TextField(default="")
creation_date=models.DateTimeField(default=timezone.now)
videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
tags = TaggableManager()
actions = ['delete']
def __str__(self):
return self.title + ": " + str(self.videofile)
def delete(self, *args, **kwargs):
session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
s3_resource = session.resource('s3')
s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
file_path = "media/" + str(self.videofile)
response = s3_bucket.delete_objects(
Delete={
'Objects': [
{
'Key': file_path
}
]
})
super(Video, self).delete(*args, **kwargs)
Di bawah ini adalah cuplikan kode yang dapat Anda gunakan untuk menghapus keranjang,
import boto3, botocore
from botocore.exceptions import ClientError
s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
s3.Object('Bucket-Name', 'file-name as key').delete()
silakan coba kode ini
import boto3
s3 = boto3.client('s3')
s3.delete_object(Bucket="s3bucketname", Key="s3filepath")