Mehrteilige Uploads mit Verzeichnis-Buckets verwenden - Amazon Simple Storage Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Mehrteilige Uploads mit Verzeichnis-Buckets verwenden

Sie können den mehrteiligen Upload-Prozess verwenden, um ein einzelnes Objekt als Satz von Teilen hochzuladen. Jeder Teil ist ein zusammenhängender Teil der Daten des Objekts. Sie können diese Objektteile unabhängig und in beliebiger Reihenfolge hochladen. Wenn die Übertragung eines Teils fehlschlägt, können Sie das Teil erneut übertragen, ohne dass dies Auswirkungen auf andere Teile hat. Nachdem alle Teile Ihres Objekts hochgeladen sind, fügt Amazon S3 diese Teile zusammen und erstellt das Objekt. Wenn Ihre Objektgröße 100 MB erreicht, sollten Sie in der Regel mehrteilige Uploads verwenden, anstatt das Objekt in einem einzigen Vorgang hochzuladen.

Die Nutzung mehrteiliger Uploads bietet die folgenden Vorteile:

  • Verbesserter Durchsatz – Sie können die Teile parallel hochladen, um den Durchsatz zu erhöhen.

  • Schnelle Wiederherstellung bei Netzwerkproblemen — Kleinere Bauteile minimieren die Auswirkungen eines Neustarts eines aufgrund eines Netzwerkfehlers fehlgeschlagenen Uploads.

  • Anhalten und Fortsetzen von Objekt-Uploads – Sie können Objektteile mit der Zeit hochladen. Nachdem Sie einen mehrteiligen Upload initiiert haben, gibt es kein Ablaufdatum. Sie müssen den mehrteiligen Upload explizit abschließen oder abbrechen.

  • Starten Sie einen Upload, bevor Sie die endgültige Objektgröße kennen – Sie können ein Objekt hochladen, während Sie es noch erstellen.

Wir empfehlen, mehrteilige Uploads auf folgende Weise zu verwenden:

  • Wenn Sie große Objekte über ein stabiles Netzwerk mit hoher Bandbreite hochladen, verwenden Sie mehrteilige Uploads, um die verfügbare Bandbreite optimal zu nutzen, indem Sie Objektteile parallel hochladen, um eine Multithread-Leistung zu erzielen.

  • Wenn Sie über ein lückenhaftes Netzwerk hochladen, verwenden Sie mehrteilige Uploads, um die Widerstandsfähigkeit gegenüber Netzwerkfehlern zu erhöhen, indem Sie Neustarts des Uploads vermeiden. Wenn Sie mehrteilige Uploads verwenden, müssen Sie erneut versuchen, nur die Teile hochzuladen, die während des Uploads unterbrochen wurden. Sie müssen nicht das gesamte Objekt von Anfang an neu hochladen.

Wenn Sie mehrteilige Uploads verwenden, um Objekte in Verzeichnis-Buckets in die Amazon S3 Express One Zone-Speicherklasse hochzuladen, ähnelt der mehrteilige Upload-Vorgang dem Vorgang des mehrteiligen Uploads zum Hochladen von Objekten in Allzweck-Buckets. Es gibt jedoch einige grundlegende Unterschiede.

Weitere Informationen zur Verwendung von mehrteiligen Uploads zum Hochladen von Objekten in die S3 Express One Zone finden Sie in den folgenden Themen.

Der mehrteilige Upload-Vorgang

Ein mehrteiliger Upload besteht aus drei Schritten:

  • Sie initiieren den Upload.

  • Sie laden die Objektteile hoch.

  • Nachdem Sie alle Teile hochgeladen haben, schließen Sie den mehrteiligen Upload ab.

Nach Erhalt der vollständigen mehrteiligen Upload-Anfrage erstellt Amazon S3 das Objekt aus den hochgeladenen Teilen, und Sie können dann wie auf jedes andere Objekt in Ihrem Bucket auf das Objekt zugreifen.

Initiieren des mehrteiligen Uploads

Wenn Sie eine Anfrage zum Initiieren eines mehrteiligen Uploads senden, gibt Amazon S3 eine Antwort mit einer Upload-ID zurück, als eindeutige Kennung für den Multipart-Upload. Sie müssen diese Upload-ID immer angeben, wenn Sie Teile hochladen, die Teile auflisten, einen Upload durchführen oder ihn abbrechen.

Teile hochladen

Beim Hochladen eines Teils müssen Sie zusätzlich zur Upload-ID eine Teilenummer angeben. Wenn Sie einen mehrteiligen Upload mit S3 Express One Zone verwenden, müssen die mehrteiligen Artikelnummern fortlaufende Artikelnummern sein. Wenn Sie versuchen, eine mehrteilige Upload-Anfrage mit nicht aufeinanderfolgenden Artikelnummern abzuschließen, wird ein Fehler HTTP 400 Bad Request (Ungültige Bestellung) generiert.

Eine Artikelnummer identifiziert eindeutig ein Teil und seine Position in dem Objekt, das Sie hochladen. Wenn Sie ein neues Teil hochladen und dabei dieselbe Artikelnummer wie ein zuvor hochgeladenes Teil verwenden, wird das zuvor hochgeladene Teil überschrieben.

Wenn Sie einen Teil hochladen, gibt Amazon S3 einen entity tag (ETag)-Header in der Antwort zurück. Für jeden Teilupload müssen Sie die Teilenummer und den ETag-Wert notieren. Die ETag-Werte für alle Uploads von Objektteilen bleiben gleich, aber jedem Teil wird eine andere Artikelnummer zugewiesen. Sie müssen diese Werte in die spätere Anforderung einschließen, um den mehrteiligen Upload abzuschließen.

Amazon S3 verschlüsselt automatisch alle neuen Objekte, die in einen S3-Bucket hochgeladen werden. Wenn Sie bei einem mehrteiligen Upload in Ihrer Kopieranforderung keine Verschlüsselungsinformationen angeben, wird die Verschlüsselungseinstellung der hochgeladenen Teile auf die Standardverschlüsselungskonfiguration des Ziel-Buckets festgelegt. Die Standardverschlüsselungskonfiguration eines Amazon-S3-Buckets ist immer aktiviert und mindestens auf serverseitige Verschlüsselung mit von Amazon S3 verwalteten Schlüsseln (SSE-S3) eingestellt. Für Verzeichnis-Buckets wird nur SSE-S3 unterstützt. Weitere Informationen finden Sie unter Serverseitige Verschlüsselung mit von Amazon S3 verwalteten Schlüsseln (SSE-S3).

Abschließen eines mehrteiligen Uploads

Wenn Sie einen mehrteiligen Upload abschließen, erstellt Amazon S3 das Objekt, indem es die Teile anhand der Artikelnummer in aufsteigender Reihenfolge verkettet. Nach einer erfolgreich ausgeführten Abschlussanforderung sind die Teile nicht mehr vorhanden.

Ihre vollständige mehrteilige Upload-Anfrage muss die Upload-ID und eine Liste der beiden Artikelnummern und der entsprechenden ETag-Werte enthalten. Die Amazon-S3-Antwort enthält einen ETag, der die kombinierten Objektdaten eindeutig identifiziert. Dieses ETag ist kein MD5-Hash der Objektdaten.

Auflistungen mehrteiliger Uploads

Sie können alle Teile eines bestimmten Multipart-Uploads oder alle laufenden mehrteiligen Uploads auflisten. Die Operation für die Teileauflistung gibt die Teileinformationen zurück, die Sie für einen bestimmten mehrteiligen Upload hochgeladen haben. Für jeden Abruf einer Teileauflistung gibt Amazon S3 die Teileinformationen für einen angegebenen mehrteiligen Upload bis zu maximal 1.000 Teilen zurück. Wenn in dem mehrteiligen Upload mehr als 1 000 Teile vorhanden sind, müssen Sie die Paginierung verwenden, um alle Teile abzurufen.

Die zurückgegebene Teileliste enthält keine Teile, deren Upload noch nicht abgeschlossen ist. Bei Verwendung der Operation Mehrteilige Uploads auflisten können Sie eine Liste aller mehrteiligen Uploads erhalten, die sich in Bearbeitung befinden.

Ein laufender mehrteiliger Upload ist ein Upload, den Sie initiiert haben, der aber noch nicht abgeschlossen ist oder abgebrochen wurde. Jeder Anforderung gibt bis zu 1.000 mehrteilige Uploads zurück. Wenn mehr als 1 000 mehrteilige Uploads vorhanden sind, müssen Sie zusätzliche Anforderungen senden, um die verbleibenden mehrteiligen Uploads abzurufen. Verwenden Sie die zurückgegebene Liste nur zur Überprüfung. Verwenden Sie das Ergebnis dieser Auflistung nicht, wenn Sie eine Anforderung für den Abschluss eines mehrteiligen Uploads senden. Halten Sie sich stattdessen an Ihre eigene Liste der Teilenummern, die Sie beim Hochladen von Teilen angegeben haben, und die diesbezüglichen ETag-Werte, die Amazon S3 zurückgegeben hat.

Weitere Informationen zu mehrteiligen Upload-Angeboten finden Sie ListPartsin der Amazon Simple Storage Service API-Referenz.

Prüfsummen mit mehrteiligen Upload-Operationen

Wenn Sie ein Objekt hochladen, können Sie einen Prüfsummenalgorithmus angeben, um die Objektintegrität zu überprüfen. MD5 wird für Verzeichnis-Buckets nicht unterstützt. Sie können einen der folgenden Algorithmen zur Prüfung der Datenintegrität mit Secure Hash Algorithms (SHA) oder Cyclic Redundancy Check (CRC) angeben:

  • CRC32

  • CRC32C

  • SHA-1

  • SHA-256

Sie können die Amazon S3 S3-REST-API oder die AWS SDKs verwenden, um den Prüfsummenwert für einzelne Teile mithilfe GetObject von oder abzurufen. HeadObject Wenn Sie die Prüfsummenwerte für einzelne Teile von mehrteiligen Uploads abrufen möchten, die noch in Bearbeitung sind, können Sie ListParts verwenden.

Wichtig

Wenn Sie die oben genannten Prüfsummenalgorithmen verwenden, müssen die mehrteiligen Artikelnummern fortlaufende Artikelnummern verwenden. Wenn Sie versuchen, eine mehrteilige Upload-Anfrage mit nicht aufeinanderfolgenden Artikelnummern abzuschließen, generiert Amazon S3 einen Fehler HTTP 400 Bad Request (Ungültige Teilbestellung).

Weitere Informationen zur Funktionsweise von Prüfsummen mit mehrteiligen Objekten finden Sie unterÜberprüfung der Objektintegrität.

Gleichzeitige mehrteilige Upload-Vorgänge

In einer verteilten Entwicklungsumgebung kann Ihre Anwendung mehrere Aktualisierungen für dasselbe Objekt gleichzeitig initiieren. Beispielsweise könnte Ihre Anwendung mehrere mehrteilige Uploads mithilfe desselben Objektschlüssels initiieren. Für jeden dieser Uploads kann Ihre Anwendung Teile hochladen und eine Anfrage auf Abschluss des Uploads an Amazon S3 senden, um das Objekt zu erstellen. Für S3 Express One Zone entspricht die Objekterstellungszeit dem Abschlussdatum des mehrteiligen Uploads.

Wichtig

Die Versionierung wird für Objekte, die in Verzeichnis-Buckets gespeichert sind, nicht unterstützt.

Mehrteilige Uploads und Preisgestaltung

Nachdem Sie einen mehrteiligen Upload gestartet haben, behält Amazon S3 alle Teile bei, bis Sie den Upload abschließen oder abbrechen. Während seiner gesamten Lebensdauer werden Ihnen der gesamte Speicher, die Bandbreite und die Anforderungen für diesen mehrteiligen Upload und die zugehörigen Teile in Rechnung gestellt. Wenn Sie den mehrteiligen Upload abbrechen, löscht Amazon S3 die Upload-Artefakte und alle Teile, die Sie hochgeladen haben, und sie werden Ihnen nicht mehr in Rechnung gestellt. Für das Löschen unvollständiger mehrteiliger Uploads fallen unabhängig von der angegebenen Speicherklasse keine Gebühren für vorzeitiges Löschen an. Weitere Informationen zu Preisen finden Sie unter Amazon-S3-Preise.

Wichtig

Wenn die vollständige mehrteilige Upload-Anfrage nicht erfolgreich gesendet wird, werden die Objektteile nicht zusammengesetzt und es wird kein Objekt erstellt. Ihnen wird der gesamte Speicher in Rechnung gestellt, der mit hochgeladenen Teilen verknüpft ist. Es ist wichtig, dass Sie entweder den mehrteiligen Upload abschließen, damit das Objekt erstellt wird, oder den mehrteiligen Upload abbrechen, um alle hochgeladenen Teile zu entfernen.

Bevor Sie einen Verzeichnis-Bucket löschen können, müssen Sie alle laufenden mehrteiligen Uploads abschließen oder abbrechen. Directory-Buckets unterstützen keine S3-Lifecycle-Konfigurationen. Bei Bedarf können Sie Ihre aktiven mehrteiligen Uploads auflisten, die Uploads dann abbrechen und dann Ihren Bucket löschen.

API-Operationen und Berechtigungen für mehrteilige Uploads

Um den Zugriff auf API-Operationen zur Objektverwaltung in einem Verzeichnis-Bucket zu ermöglichen, erteilen Sie die s3express:CreateSession Berechtigung in einer Bucket-Richtlinie oder einer identitätsbasierten AWS Identity and Access Management (IAM-) Richtlinie.

Sie müssen über die erforderlichen Berechtigungen verfügen, um die Multipart-Upload-Vorgänge zu verwenden. Sie können Bucket-Richtlinien oder identitätsbasierte IAM-Richtlinien verwenden, um IAM-Prinzipalen Berechtigungen zur Ausführung dieser Operationen zu gewähren. Die folgende Tabelle listet die erforderlichen Berechtigungen für verschiedene mehrteilige Uploadvorgänge auf.

Sie können den Initiator eines mehrteiligen Uploads anhand des Elements identifizieren. Initiator Wenn es sich bei dem Initiator um einen handelt AWS-Konto, liefert dieses Element dieselben Informationen wie das Element. Owner Wenn der Initiator ein IAM-Benutzer ist, stellt dieses Element den Benutzer-ARN und den Anzeigenamen bereit.

Aktion Erforderliche Berechtigungen

Erstellen eines mehrteiligen Uploads

Um den mehrteiligen Upload zu erstellen, müssen Sie berechtigt sein, die s3express:CreateSession Aktion im Verzeichnis-Bucket auszuführen.

Initiieren Sie einen mehrteiligen Upload

Um den mehrteiligen Upload zu initiieren, müssen Sie berechtigt sein, die s3express:CreateSession Aktion für den Verzeichnis-Bucket auszuführen.

Laden Sie einen Teil hoch

Um ein Teil hochzuladen, müssen Sie berechtigt sein, die s3express:CreateSession Aktion im Verzeichnis-Bucket auszuführen.

Damit der Initiator einen Teil hochladen kann, muss der Bucket-Besitzer dem Initiator erlauben, die s3express:CreateSession Aktion für den Verzeichnis-Bucket auszuführen.

Laden Sie einen Teil hoch (Kopie)

Um ein Teil hochzuladen, müssen Sie berechtigt sein, die s3express:CreateSession Aktion im Verzeichnis-Bucket auszuführen.

Damit der Initiator einen Teil eines Objekts hochladen kann, muss der Bucket-Besitzer dem Initiator eine Genehmigung für die Ausführung der Aktion s3express:CreateSession für das Objekt erteilen.

Abschließen eines mehrteiligen Uploads

Um einen mehrteiligen Upload abzuschließen, müssen Sie berechtigt sein, die s3express:CreateSession Aktion im Verzeichnis-Bucket auszuführen.

Damit der Initiator einen mehrteiligen Upload abschließen kann, muss der Bucket-Besitzer dem Initiator gestatten, die s3express:CreateSession Aktion für das Objekt auszuführen.

Abbrechen eines mehrteiligen Uploads

Um einen mehrteiligen Upload abzubrechen, müssen Sie berechtigt sein, die Aktion auszuführen. s3express:CreateSession

Damit der Initiator einen mehrteiligen Upload abbrechen kann, muss dem Initiator die ausdrückliche Zugriffsberechtigung für die Ausführung der Aktion gewährt werden. s3express:CreateSession

Teile auflisten

Um die Teile in einem mehrteiligen Upload aufzulisten, müssen Sie berechtigt sein, die s3express:CreateSession Aktion im Verzeichnis-Bucket auszuführen.

Laufende mehrteilige Uploads auflisten

Um die laufenden mehrteiligen Uploads in einen Bucket aufzulisten, müssen Sie berechtigt sein, die s3:ListBucketMultipartUploads Aktion für diesen Bucket auszuführen.

Unterstützung des API-Betriebs für mehrteilige Uploads

In den folgenden Abschnitten der Amazon Simple Storage Service API-Referenz werden die Amazon S3 S3-REST-API-Operationen für mehrteilige Uploads beschrieben.

Beispiele

Um einen mehrteiligen Upload zu verwenden, um ein Objekt in eine S3 Express One Zone in einem Verzeichnis-Bucket hochzuladen, sehen Sie sich die folgenden Beispiele an.

Erstellen eines mehrteiligen Uploads

Die folgenden Beispiele zeigen, wie Sie einen mehrteiligen Upload erstellen.

SDK for Java 2.x
/** * This method creates a multipart upload request that generates a unique upload ID that is used to track * all the upload parts * * @param s3 * @param bucketName - for example, 'doc-example-bucket--use1-az4--x-s3' * @param key * @return */ private static String createMultipartUpload(S3Client s3, String bucketName, String key) { CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .build(); String uploadId = null; try { CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest); uploadId = response.uploadId(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return uploadId;
SDK for Python
def create_multipart_upload(s3_client, bucket_name, key_name): ''' Create a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: The destination bucket for the multipart upload :param key_name: The key name for the object to be uploaded :return: The UploadId for the multipart upload if created successfully, else None ''' try: mpu = s3_client.create_multipart_upload(Bucket = bucket_name, Key = key_name) return mpu['UploadId'] except ClientError as e: logging.error(e) return None

Dieses Beispiel zeigt, wie Sie mithilfe von einen mehrteiligen Upload in einen Verzeichnis-Bucket erstellen. AWS CLIDieser Befehl startet einen mehrteiligen Upload in den Verzeichnis-Bucket bucket-base-name-- azid --x-s3 für das Objekt KEY_NAME. Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api create-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME

Weitere Informationen finden Sie create-multipart-uploadin der AWS Command Line Interface.

Die Teile eines mehrteiligen Uploads hochladen

Die folgenden Beispiele zeigen, wie Teile eines mehrteiligen Uploads hochgeladen werden.

SDK for Java 2.x

Das folgende Beispiel zeigt, wie Sie ein einzelnes Objekt in Teile aufteilen und diese Teile dann mithilfe des SDK for Java 2.x in einen Verzeichnis-Bucket hochladen.

/** * This method creates part requests and uploads individual parts to S3 and then returns all the completed parts * * @param s3 * @param bucketName * @param key * @param uploadId * @throws IOException */ private static ListCompletedPartmultipartUpload(S3Client s3, String bucketName, String key, String uploadId, String filePath) throws IOException { int partNumber = 1; ListCompletedPart completedParts = new ArrayList<>(); ByteBuffer bb = ByteBuffer.allocate(1024 * 1024 * 5); // 5 MB byte buffer // read the local file, breakdown into chunks and process try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) { long fileSize = file.length(); int position = 0; while (position < fileSize) { file.seek(position); int read = file.getChannel().read(bb); bb.flip(); // Swap position and limit before reading from the buffer. UploadPartRequest uploadPartRequest = UploadPartRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .partNumber(partNumber) .build(); UploadPartResponse partResponse = s3.uploadPart( uploadPartRequest, RequestBody.fromByteBuffer(bb)); CompletedPart part = CompletedPart.builder() .partNumber(partNumber) .eTag(partResponse.eTag()) .build(); completedParts.add(part); bb.clear(); position += read; partNumber++; } } catch (IOException e) { throw e; } return completedParts; }
SDK for Python

Das folgende Beispiel zeigt, wie Sie ein einzelnes Objekt in Teile aufteilen und diese Teile dann mithilfe des SDK für Python in einen Verzeichnis-Bucket hochladen.

def multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_size): ''' Break up a file into multiple parts and upload those parts to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name for object to be uploaded and for the local file that's being uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_size: The size parts that the object will be broken into, in bytes. Minimum 5 MiB, Maximum 5 GiB. There is no minimum size for the last part of your multipart upload. :return: part_list for the multipart upload if all parts are uploaded successfully, else None ''' part_list = [] try: with open(key_name, 'rb') as file: part_counter = 1 while True: file_part = file.read(part_size) if not len(file_part): break upload_part = s3_client.upload_part( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, Body = file_part, PartNumber = part_counter ) part_list.append({'PartNumber': part_counter, 'ETag': upload_part['ETag']}) part_counter += 1 except ClientError as e: logging.error(e) return None return part_list

Dieses Beispiel zeigt, wie Sie ein einzelnes Objekt in Teile aufteilen und diese Teile dann mithilfe von in einen Verzeichnis-Bucket hochladen AWS CLI. Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api upload-part --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --part-number 1 --body LOCAL_FILE_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"

Weitere Informationen finden Sie unter Upload-Teil im. AWS Command Line Interface

Abschließen eines mehrteiligen Uploads

Die folgenden Beispiele zeigen, wie Sie einen mehrteiligen Upload abschließen.

SDK for Java 2.x

Die folgenden Beispiele zeigen, wie ein mehrteiliger Upload mithilfe des SDK for Java 2.x abgeschlossen wird.

/** * This method completes the multipart upload request by collating all the upload parts * @param s3 * @param bucketName - for example, 'doc-example-bucket--usw2-az1--x-s3' * @param key * @param uploadId * @param uploadParts */ private static void completeMultipartUpload(S3Client s3, String bucketName, String key, String uploadId, ListCompletedPart uploadParts) { CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder() .parts(uploadParts) .build(); CompleteMultipartUploadRequest completeMultipartUploadRequest = CompleteMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .uploadId(uploadId) .multipartUpload(completedMultipartUpload) .build(); s3.completeMultipartUpload(completeMultipartUploadRequest); } public static void multipartUploadTest(S3Client s3, String bucketName, String key, String localFilePath) { System.out.println("Starting multipart upload for: " + key); try { String uploadId = createMultipartUpload(s3, bucketName, key); System.out.println(uploadId); ListCompletedPart parts = multipartUpload(s3, bucketName, key, uploadId, localFilePath); completeMultipartUpload(s3, bucketName, key, uploadId, parts); System.out.println("Multipart upload completed for: " + key); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Die folgenden Beispiele zeigen, wie ein mehrteiliger Upload mithilfe des SDK für Python abgeschlossen wird.

def complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): ''' Completes a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: The destination bucket for the multipart upload :param key_name: The key name for the object to be uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_list: The list of uploaded part numbers with their associated ETags :return: True if the multipart upload was completed successfully, else False ''' try: s3_client.complete_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, MultipartUpload = { 'Parts': part_list } ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': MB = 1024 ** 2 region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'OBJECT_NAME' part_size = 10 * MB s3_client = boto3.client('s3', region_name = region) mpu_id = create_multipart_upload(s3_client, bucket_name, key_name) if mpu_id is not None: part_list = multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_size) if part_list is not None: if complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): print (f'{key_name} successfully uploaded through a ultipart upload to {bucket_name}') else: print (f'Could not upload {key_name} hrough a multipart upload to {bucket_name}')

Dieses Beispiel zeigt, wie Sie einen mehrteiligen Upload für einen Verzeichnis-Bucket mithilfe von abschließen. AWS CLI Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api complete-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA" --multipart-upload file://parts.json

In diesem Beispiel wird eine JSON-Struktur verwendet, die die Teile des mehrteiligen Uploads beschreibt, die wieder zur vollständigen Datei zusammengesetzt werden sollen. In diesem Beispiel wird das file:// Präfix verwendet, um die JSON-Struktur aus einer Datei im lokalen Ordner mit dem Namen zu laden. parts

parts.json:

parts.json { "Parts": [ { "ETag": "6b78c4a64dd641a58dac8d9258b88147", "PartNumber": 1 } ] }

Weitere Informationen finden Sie complete-multipart-uploadin der. AWS Command Line Interface

Abbrechen eines mehrteiligen Uploads

Die folgenden Beispiele zeigen, wie Sie einen mehrteiligen Upload abbrechen.

SDK for Java 2.x

Das folgende Beispiel zeigt, wie ein mehrteiliger Upload mithilfe des SDK for Java 2.x abgebrochen wird.

public static void abortMultiPartUploads( S3Client s3, String bucketName ) { try { ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest.builder() .bucket(bucketName) .build(); ListMultipartUploadsResponse response = s3.listMultipartUploads(listMultipartUploadsRequest); ListMultipartUpload uploads = response.uploads(); AbortMultipartUploadRequest abortMultipartUploadRequest; for (MultipartUpload upload: uploads) { abortMultipartUploadRequest = AbortMultipartUploadRequest.builder() .bucket(bucketName) .key(upload.key()) .uploadId(upload.uploadId()) .build(); s3.abortMultipartUpload(abortMultipartUploadRequest); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Das folgende Beispiel zeigt, wie ein mehrteiliger Upload mithilfe des SDK für Python abgebrochen wird.

import logging import boto3 from botocore.exceptions import ClientError def abort_multipart_upload(s3_client, bucket_name, key_name, upload_id): ''' Aborts a partial multipart upload in a directory bucket. :param s3_client: boto3 S3 client :param bucket_name: Bucket where the multipart upload was initiated - for example, 'doc-example-bucket--usw2-az1--x-s3' :param key_name: Name of the object for which the multipart upload needs to be aborted :param upload_id: Multipart upload ID for the multipart upload to be aborted :return: True if the multipart upload was successfully aborted, False if not ''' try: s3_client.abort_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = upload_id ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'KEY_NAME' upload_id = 'UPLOAD_ID' s3_client = boto3.client('s3', region_name = region) if abort_multipart_upload(s3_client, bucket_name, key_name, upload_id): print (f'Multipart upload for object {key_name} in {bucket_name} bucket has been aborted') else: print (f'Unable to abort multipart upload for object {key_name} in {bucket_name} bucket')

Das folgende Beispiel zeigt, wie Sie einen mehrteiligen Upload mit dem abbrechen. AWS CLI Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api abort-multipart-upload --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEAX5hFw-MAQAAAAB0OxUFeA7LTbWWFS8WYwhrxDxTIDN-pdEEq_agIHqsbg"

Weitere Informationen finden Sie abort-multipart-uploadin der AWS Command Line Interface.

Erstellen eines mehrteiligen Upload-Kopiervorgangs

Die folgenden Beispiele zeigen, wie Objekte mithilfe eines mehrteiligen Uploads von einem Bucket in einen anderen kopiert werden.

SDK for Java 2.x

Das folgende Beispiel zeigt, wie ein mehrteiliger Upload verwendet wird, um mithilfe des SDK for Java 2.x ein Objekt programmgesteuert von einem Bucket in einen anderen zu kopieren.

/** * This method creates a multipart upload request that generates a unique upload ID that is used to track * all the upload parts. * * @param s3 * @param bucketName * @param key * @return */ private static String createMultipartUpload(S3Client s3, String bucketName, String key) { CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(bucketName) .key(key) .build(); String uploadId = null; try { CreateMultipartUploadResponse response = s3.createMultipartUpload(createMultipartUploadRequest); uploadId = response.uploadId(); } catch (S3Exception e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return uploadId; } /** * Creates copy parts based on source object size and copies over individual parts * * @param s3 * @param sourceBucket * @param sourceKey * @param destnBucket * @param destnKey * @param uploadId * @return * @throws IOException */ public static ListCompletedPart multipartUploadCopy(S3Client s3, String sourceBucket, String sourceKey, String destnBucket, String destnKey, String uploadId) throws IOException { // Get the object size to track the end of the copy operation. HeadObjectRequest headObjectRequest = HeadObjectRequest .builder() .bucket(sourceBucket) .key(sourceKey) .build(); HeadObjectResponse response = s3.headObject(headObjectRequest); Long objectSize = response.contentLength(); System.out.println("Source Object size: " + objectSize); // Copy the object using 20 MB parts. long partSize = 20 * 1024 * 1024; long bytePosition = 0; int partNum = 1; ListCompletedPart completedParts = new ArrayList<>(); while (bytePosition < objectSize) { // The last part might be smaller than partSize, so check to make sure // that lastByte isn't beyond the end of the object. long lastByte = Math.min(bytePosition + partSize - 1, objectSize - 1); System.out.println("part no: " + partNum + ", bytePosition: " + bytePosition + ", lastByte: " + lastByte); // Copy this part. UploadPartCopyRequest req = UploadPartCopyRequest.builder() .uploadId(uploadId) .sourceBucket(sourceBucket) .sourceKey(sourceKey) .destinationBucket(destnBucket) .destinationKey(destnKey) .copySourceRange("bytes="+bytePosition+"-"+lastByte) .partNumber(partNum) .build(); UploadPartCopyResponse res = s3.uploadPartCopy(req); CompletedPart part = CompletedPart.builder() .partNumber(partNum) .eTag(res.copyPartResult().eTag()) .build(); completedParts.add(part); partNum++; bytePosition += partSize; } return completedParts; } public static void multipartCopyUploadTest(S3Client s3, String srcBucket, String srcKey, String destnBucket, String destnKey) { System.out.println("Starting multipart copy for: " + srcKey); try { String uploadId = createMultipartUpload(s3, destnBucket, destnKey); System.out.println(uploadId); ListCompletedPart parts = multipartUploadCopy(s3, srcBucket, srcKey,destnBucket, destnKey, uploadId); completeMultipartUpload(s3, destnBucket, destnKey, uploadId, parts); System.out.println("Multipart copy completed for: " + srcKey); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Das folgende Beispiel zeigt, wie ein mehrteiliger Upload verwendet wird, um mithilfe des SDK für Python ein Objekt programmgesteuert von einem Bucket in einen anderen zu kopieren.

import logging import boto3 from botocore.exceptions import ClientError def head_object(s3_client, bucket_name, key_name): ''' Returns metadata for an object in a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Bucket that contains the object to query for metadata :param key_name: Key name to query for metadata :return: Metadata for the specified object if successful, else None ''' try: response = s3_client.head_object( Bucket = bucket_name, Key = key_name ) return response except ClientError as e: logging.error(e) return None def create_multipart_upload(s3_client, bucket_name, key_name): ''' Create a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name of the object to be uploaded :return: UploadId for the multipart upload if created successfully, else None ''' try: mpu = s3_client.create_multipart_upload(Bucket = bucket_name, Key = key_name) return mpu['UploadId'] except ClientError as e: logging.error(e) return None def multipart_copy_upload(s3_client, source_bucket_name, key_name, target_bucket_name, mpu_id, part_size): ''' Copy an object in a directory bucket to another bucket in multiple parts of a specified size :param s3_client: boto3 S3 client :param source_bucket_name: Bucket where the source object exists :param key_name: Key name of the object to be copied :param target_bucket_name: Destination bucket for copied object :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_size: The size parts that the object will be broken into, in bytes. Minimum 5 MiB, Maximum 5 GiB. There is no minimum size for the last part of your multipart upload. :return: part_list for the multipart copy if all parts are copied successfully, else None ''' part_list = [] copy_source = { 'Bucket': source_bucket_name, 'Key': key_name } try: part_counter = 1 object_size = head_object(s3_client, source_bucket_name, key_name) if object_size is not None: object_size = object_size['ContentLength'] while (part_counter - 1) * part_size <object_size: bytes_start = (part_counter - 1) * part_size bytes_end = (part_counter * part_size) - 1 upload_copy_part = s3_client.upload_part_copy ( Bucket = target_bucket_name, CopySource = copy_source, CopySourceRange = f'bytes={bytes_start}-{bytes_end}', Key = key_name, PartNumber = part_counter, UploadId = mpu_id ) part_list.append({'PartNumber': part_counter, 'ETag': upload_copy_part['CopyPartResult']['ETag']}) part_counter += 1 except ClientError as e: logging.error(e) return None return part_list def complete_multipart_upload(s3_client, bucket_name, key_name, mpu_id, part_list): ''' Completes a multipart upload to a directory bucket :param s3_client: boto3 S3 client :param bucket_name: Destination bucket for the multipart upload :param key_name: Key name of the object to be uploaded :param mpu_id: The UploadId returned from the create_multipart_upload call :param part_list: List of uploaded part numbers with associated ETags :return: True if the multipart upload was completed successfully, else False ''' try: s3_client.complete_multipart_upload( Bucket = bucket_name, Key = key_name, UploadId = mpu_id, MultipartUpload = { 'Parts': part_list } ) except ClientError as e: logging.error(e) return False return True if __name__ == '__main__': MB = 1024 ** 2 region = 'us-west-2' source_bucket_name = 'SOURCE_BUCKET_NAME' target_bucket_name = 'TARGET_BUCKET_NAME' key_name = 'KEY_NAME' part_size = 10 * MB s3_client = boto3.client('s3', region_name = region) mpu_id = create_multipart_upload(s3_client, target_bucket_name, key_name) if mpu_id is not None: part_list = multipart_copy_upload(s3_client, source_bucket_name, key_name, target_bucket_name, mpu_id, part_size) if part_list is not None: if complete_multipart_upload(s3_client, target_bucket_name, key_name, mpu_id, part_list): print (f'{key_name} successfully copied through multipart copy from {source_bucket_name} to {target_bucket_name}') else: print (f'Could not copy {key_name} through multipart copy from {source_bucket_name} to {target_bucket_name}')

Das folgende Beispiel zeigt, wie ein mehrteiliger Upload verwendet wird, um mithilfe von programmgesteuert ein Objekt von einem Bucket in einen Verzeichnis-Bucket zu kopieren. AWS CLI Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api upload-part-copy --bucket bucket-base-name--azid--x-s3 --key TARGET_KEY_NAME --copy-source SOURCE_BUCKET_NAME/SOURCE_KEY_NAME --part-number 1 --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBnJ4cxKMAQAAAABiNXpOFVZJ1tZcKWib9YKE1C565_hCkDJ_4AfCap2svg"

Weitere Informationen finden Sie upload-part-copyin der AWS Command Line Interface.

Liste laufender mehrteiliger Uploads

Um in Bearbeitung befindliche mehrteilige Uploads in einen Verzeichnis-Bucket aufzulisten, können Sie die SDKs oder die verwenden. AWS AWS CLI

SDK for Java 2.x

Die folgenden Beispiele zeigen, wie Sie laufende (unvollständige) mehrteilige Uploads mithilfe des SDK for Java 2.x auflisten können.

public static void listMultiPartUploads( S3Client s3, String bucketName) { try { ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest.builder() .bucket(bucketName) .build(); ListMultipartUploadsResponse response = s3.listMultipartUploads(listMultipartUploadsRequest); List MultipartUpload uploads = response.uploads(); for (MultipartUpload upload: uploads) { System.out.println("Upload in progress: Key = \"" + upload.key() + "\", id = " + upload.uploadId()); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Die folgenden Beispiele zeigen, wie in Bearbeitung befindliche (unvollständige) mehrteilige Uploads mithilfe des SDK für Python aufgelistet werden.

import logging import boto3 from botocore.exceptions import ClientError def list_multipart_uploads(s3_client, bucket_name): ''' List any incomplete multipart uploads in a directory bucket in e specified gion :param s3_client: boto3 S3 client :param bucket_name: Bucket to check for incomplete multipart uploads :return: List of incomplete multipart uploads if there are any, None if not ''' try: response = s3_client.list_multipart_uploads(Bucket = bucket_name) if 'Uploads' in response.keys(): return response['Uploads'] else: return None except ClientError as e: logging.error(e) if __name__ == '__main__': bucket_name = 'BUCKET_NAME' region = 'us-west-2' s3_client = boto3.client('s3', region_name = region) multipart_uploads = list_multipart_uploads(s3_client, bucket_name) if multipart_uploads is not None: print (f'There are {len(multipart_uploads)} ncomplete multipart uploads for {bucket_name}') else: print (f'There are no incomplete multipart uploads for {bucket_name}')

Die folgenden Beispiele zeigen, wie Sie in Bearbeitung befindliche (unvollständige) mehrteilige Uploads mithilfe von auflisten können. AWS CLI Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api list-multipart-uploads --bucket bucket-base-name--azid--x-s3

Weitere Informationen finden Sie list-multipart-uploadsin der AWS Command Line Interface.

Auflisten der Teile eines mehrteiligen Uploads

Die folgenden Beispiele zeigen, wie die Teile eines mehrteiligen Uploads in einen Verzeichnis-Bucket aufgelistet werden.

SDK for Java 2.x

Die folgenden Beispiele zeigen, wie die Teile eines mehrteiligen Uploads in einen Directory-Bucket mithilfe des SDK for Java 2.x aufgelistet werden.

public static void listMultiPartUploadsParts( S3Client s3, String bucketName, String objKey, String uploadID) { try { ListPartsRequest listPartsRequest = ListPartsRequest.builder() .bucket(bucketName) .uploadId(uploadID) .key(objKey) .build(); ListPartsResponse response = s3.listParts(listPartsRequest); ListPart parts = response.parts(); for (Part part: parts) { System.out.println("Upload in progress: Part number = \"" + part.partNumber() + "\", etag = " + part.eTag()); } } catch (S3Exception e) { System.err.println(e.getMessage()); System.exit(1); } }
SDK for Python

Die folgenden Beispiele zeigen, wie Sie die Teile eines mehrteiligen Uploads in einen Verzeichnis-Bucket mithilfe des SDK für Python auflisten.

import logging import boto3 from botocore.exceptions import ClientError def list_parts(s3_client, bucket_name, key_name, upload_id): ''' Lists the parts that have been uploaded for a specific multipart upload to a directory bucket. :param s3_client: boto3 S3 client :param bucket_name: Bucket that multipart uploads parts have been uploaded to :param key_name: Name of the object that has parts uploaded :param upload_id: Multipart upload ID that the parts are associated with :return: List of parts associated with the specified multipart upload, None if there are no parts ''' parts_list = [] next_part_marker = '' continuation_flag = True try: while continuation_flag: if next_part_marker == '': response = s3_client.list_parts( Bucket = bucket_name, Key = key_name, UploadId = upload_id ) else: response = s3_client.list_parts( Bucket = bucket_name, Key = key_name, UploadId = upload_id, NextPartMarker = next_part_marker ) if 'Parts' in response: for part in response['Parts']: parts_list.append(part) if response['IsTruncated']: next_part_marker = response['NextPartNumberMarker'] else: continuation_flag = False else: continuation_flag = False return parts_list except ClientError as e: logging.error(e) return None if __name__ == '__main__': region = 'us-west-2' bucket_name = 'BUCKET_NAME' key_name = 'KEY_NAME' upload_id = 'UPLOAD_ID' s3_client = boto3.client('s3', region_name = region) parts_list = list_parts(s3_client, bucket_name, key_name, upload_id) if parts_list is not None: print (f'{key_name} has {len(parts_list)} parts uploaded to {bucket_name}') else: print (f'There are no multipart uploads with that upload ID for {bucket_name} bucket')

Die folgenden Beispiele zeigen, wie Sie die Teile eines mehrteiligen Uploads in einen Verzeichnis-Bucket mithilfe von auflisten können. AWS CLI Um den Befehl zu verwenden, ersetzen Sie die Platzhalter für Benutzereingaben durch Ihre eigenen Informationen.

aws s3api list-parts --bucket bucket-base-name--azid--x-s3 --key KEY_NAME --upload-id "AS_mgt9RaQE9GEaifATue15dAAAAAAAAAAEMAAAAAAAAADQwNzI4MDU0MjUyMBYAAAAAAAAAAA0AAAAAAAAAAAH2AfYAAAAAAAAEBSD0WBKMAQAAAABneY9yBVsK89iFkvWdQhRCcXohE8RbYtc9QvBOG8tNpA"

Weitere Informationen finden Sie unter list-parts in der. AWS Command Line Interface