Skip to content

1. Upload file lên bucket

s3.Object('BUCKET_NAME', 'PATH_TO_REMOTE_FILE').put(
    Body=open('PATH_TO_LOCAL_FILE', 'rb'),
    ACL='public-read'
)

Trong đó:

  • BUCKET_NAME là tên của bucket
  • PATH_TO_REMOTE_FILE là đường dẫn đến file đích
  • PATH_TO_LOCAL_FILE là đường dẫn từ file gốc

2. Multipart upload lên bucket

  • Multipart upload giúp người dùng quản lý việc upload các file lớn. Các file lớn sẽ được upload lên theo từng part, sau khi tất cả các part đã được upload lên file đó sẽ được nối lại.

  • Size của 1 part tối thiểu là 5MB.

    from boto3.s3.transfer import TransferConfig
    config = TransferConfig(
        multipart_threshold=50*1024*1024,  # Mỗi chunk có dung lượng là 50MB
        max_concurrency=10,
        num_download_attempts=10
        )
    
    s3.Bucket("BUCKET_NAME").upload_file("PATH_TO_LOCAL_FILE", "KEY_NAME", Config=config)
    

    Trong đó:

    • BUCKET_NAME: là tên của Bucket
    • PATH_TO_LOCAL_FILE: là đường dẫn từ file gốc
    • KEY_NAME: là đường dẫn lưu trong Bucket

3. Download

for bucket in s3.buckets.all():
    print(bucket.name)
bucket = s3.Bucket('BUCKET_NAME')
with open('PATH_TO_LOCAL_FILE', 'wb') as data:
    s3client.download_fileobj(bucket, 'KEY_NAME', data)

Trong đó:

  • BUCKET_NAME: là tên của Bucket
  • PATH_TO_LOCAL_FILE: là đường dẫn từ file gốc
  • KEY_NAME: là đường dẫn lưu trong Bucket

4. Lấy thông tin một object theo đường dẫn

Lấy thông tin của object như: name, content-type, last_modified

bucket = s3.Bucket('BUCKET_NAME')
obj = bucket.Object('folder/picture.png')
obj.content_length
print(obj.get())

Sẽ cho ra output như sau:

{
 'ResponseMetadata': {'RequestId': 'tx0000000000000065673c0-005caaf09b-e33e020-hn-1',
 'HostId': '',
 'HTTPStatusCode': 200,
 'HTTPHeaders': {'date': 'Mon, 08 Apr 2019 06:59:58 GMT',
 'content-type': 'binary/octet-stream',
 'content-length': '1266761',
 'connection': 'keep-alive',
 'accept-ranges': 'bytes',
 'last-modified': 'Mon, 20 Oct 2023 8:27:24 GMT',
 'x-amz-version-id': 'qFj4NFLXnRTE9G-UuD4ktam5IErzNb3',
 'etag': '"d822d300080849e746782e98033cb86a"',
 'x-amz-request-id': 'tx0000000000000065673c0-005caaf09b-e33e020-hn-1',
 'server': 'ngx-01',
 'strict-transport-security': 'max-age=15768000'},
 'RetryAttempts': 0},
 'AcceptRanges': 'bytes',
 'LastModified': datetime.datetime(2018, 9, 10, 10, 7, 37, tzinfo=tzutc()),
 'ContentLength': 1266761,
 'ETag': '"d822d300080849e746782e98033cb86a"',
 'VersionId': 'qFj4NFLXnRTE9G-UuD4ktam5IErzNb3',
 'ContentType': 'binary/octet-stream',
 'Metadata': {},
 'Body': <botocore.response.StreamingBody at 0x7efe7bc15c18>
}

5. Danh sách phiên bản của một object

Khi bucket bật chức năng versioning, người dùng có thể list ra tất cả các version của object.

versions = s3.Bucket('BUCKET_NAME').object_versions.filter(Prefix='picture.png')
for version in versions:
    print('ver_id: {} '.format(version.id))

# out put
# ver_id: UxMLn4KNdk5Kx8IH.ZlD7v6xHxqHaLV
# ver_id: KTMC4VxvTGK0i0npqxdwaZy2U5fBEKa
# ver_id: uFfTITyB5D2Z8IMoB02HaxFHR-aAsqT
# ver_id: 7aH1IkSLHlHSJgSrhc-2dXH34q4Ar33

6. Xóa

  • Xóa file thông thường:
    object = s3.Object('BUCKET_NAME','FILE_NAME')
    object.delete()
    
  • Xoá file sử dụng xác thực nhiều bước:
    object = s3.Object('BUCKET_NAME','FILE_NAME')
    object.delete(
        MFA='TOKEN',
        VersionId='VERSION_ID',
        RequestPayer='requester',
        BypassGovernanceRetention=True|False
    )
    
    Trong đó:
    • BUCKET_NAME: tên bucket
    • FILE_NAME: tên file
    • TOKEN: là multi-factor token hợp lệ tại thời điểm xoá
    • VERSION_ID: là id version của object tại thời điểm xóa

7. Sao chép

copy_source = {
      'Bucket': 'SRC_BUCKET',
      'Key': 'SRC_OBJECT'
    }
bucket = s3.Bucket('END_BUCKET')
bucket.copy(copy_source, 'END_OBJECT')

Trong đó:

  • SRC_BUCKET: là tên bucket nguồn
  • SRC_OBJECT: là đường dẫn file nguồn
  • END_BUCKET: là bucket đích muốn copy tới, bạn có thể copy file tới bucket khác hoặc cùng một bucket
  • END_OBJECT: là đường dẫn file đích muốn copy tới

8. Quản lý Object ACL

  • GET:

    object_acl = s3.ObjectAcl('BUCKET_NAME','FILE_NAME')
    
  • SET:

    object_acl = s3.ObjectAcl('BUCKET_NAME','FILE_NAME')
    object_acl.put(
        ACL= 'private'|'public-read'|'public-read-write'|'authenticated-read'|'aws-exec-read'|'bucket-owner-read'|'bucket-owner-full-control',
        AccessControlPolicy={
            'Grants': [
                {
                    'Grantee': {
                        'DisplayName': 'string',
                        'EmailAddress': 'string',
                        'ID': 'string',
                        'Type': 'CanonicalUser'|'AmazonCustomerByEmail'|'Group',
                        'URI': 'string'
                    },
                    'Permission': 'FULL_CONTROL'|'WRITE'|'WRITE_ACP'|'READ'|'READ_ACP'
                },
            ],
            'Owner': {
                'DisplayName': 'string',
                'ID': 'string'
            }
        },
        GrantFullControl='string',
        GrantRead='string',
        GrantReadACP='string',
        GrantWrite='string',
        GrantWriteACP='string',
        RequestPayer='requester',
        VersionId='string'
    )
    

9. Chia sẻ

  • Dưới đây là ví dụ chia sẻ 1 file tên picture.png từ bucket BUCKET_NAME
s3client.generate_presigned_url('get_object', Params = {'Bucket': 'BUCKET_NAME', 'Key': 'picture.png'}, ExpiresIn = 1000)
# 'https://objectstorage.omzcloud.vn/BUCKET_NAME/picture.png?AWSAccessKeyId=xxxxxxxxxx&Signature=o%xxxxxxxxxxxxxxxxxxxxx%3D&Expires=1554709802'
  • Người dùng sử dụng tính năng này để generate ra url trên server, sau đó client sử dụng link để thực hiện tao thác upload object lên Object Storage.

  • Khi đã có được link tạo ra từ server, các client có thể sử dụng thư viện hoặc câu lệnh để thực hiện việc upload. Ví dụ dưới đây sử dụng câu lệnh curl trên linux.

  • Với link không có metadata thì sử dụng lệnh duới đây:

    curl --request PUT --upload-file PATH_TO_REMOTE_FILE "<url>"
    
  • Với link có metadata thì cần thêm header để đẩy thêm header lên server:

    $ curl --request PUT --upload-file picture.png  -H 'Content-Type:image/jpeg' -H 'x-amz-acl:public-read' "<url>"
    
  • Chú ý*:

    • Khi sử dụng tính năng này, cần chú ý khi sử dụng presigned-url, số lượng header được sinh ra ở trong câu lệnh presigned-url sẽ phải có tương ứng với cả lượng header khi sử dựng các client để upload file lên server.
    • Ví dụ ở dưới khi gen code server, có 2 header là Content-Type và x-amz-acl thì khi sử dụng các client, ví dụ như ở trên là sử dụng lệnh curl thì cũng phải có 2 header đó là Content-Type và x-amz-acl.
    s3client = boto3.client(
        's3',
        endpoint_url=endpoint_url,
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        config=Config(signature_version='s3v4')
    )
    // Url chỉ bao gồm bucket, file
    presigned_url = s3client.generate_presigned_url('put_object', Params={'Bucket':BUCKET_NAME, 'Key':'FILE_NAME'}, ExpiresIn=3600, HttpMethod='PUT')
    
    // Url bao gồm bucket, file và metadata ACL và Content-Type
    presigned_url_with_metadata = s3client.generate_presigned_url('put_object', Params={'Bucket':BUCKET_NAME, 'Key':'FILE_NAME','ContentType':'image/jpeg','ACL':'public-read'}, ExpiresIn=3600, HttpMethod='PUT')
    

    Trong đó:

    • ACCESS_KEY_IDSECRET_KEY_ID được lấy từ giao diện sau khi bạn đã khởi tạo Object Storage thành công
    • BUCKET_NAME là tên của bucket
    • FILE_NAME là tên của file