Azure Storage Blob Clientbibliothek für Java – Version 12.24.1
Azure Blob Storage ist die Objektspeicherlösung von Microsoft für die Cloud. Blob Storage ist für die Speicherung großer Mengen unstrukturierter Daten optimiert. Unstrukturierte Daten sind Daten, die keinem bestimmten Datenmodell und keiner bestimmten Definition entsprechen (also beispielsweise Text- oder Binärdaten).
Quellcode | API-Referenzdokumentation | DOKUMENTATION | ZUR REST-APIProduktdokumentation | Proben
Erste Schritte
Voraussetzungen
- Java Development Kit (JDK) mit Version 8 oder höher
- Azure-Abonnement
- Speicherkonto erstellen
Einschließen des Pakets
BOM-Datei einfügen
Fügen Sie das azure-sdk-bom in Ihr Projekt ein, um die Abhängigkeit von der GA-Version der Bibliothek zu übernehmen. Ersetzen Sie im folgenden Codeausschnitt den Platzhalter {bom_version_to_target} durch die Versionsnummer. Weitere Informationen zur Stückliste finden Sie in der AZURE SDK-BOM-INFODATEI.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-sdk-bom</artifactId>
<version>{bom_version_to_target}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
und fügen Sie dann die direkte Abhängigkeit ohne Versions-Tag in den Abschnitt „Abhängigkeit“ ein.
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
</dependency>
</dependencies>
Direkte Abhängigkeiten einfügen
Wenn Sie abhängigkeiten von einer bestimmten Version der Bibliothek übernehmen möchten, die in der Stückliste nicht vorhanden ist, fügen Sie die direkte Abhängigkeit wie folgt zu Ihrem Projekt hinzu.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.24.1</version>
</dependency>
Erstellen eines Speicherkontos
Zum Erstellen eines Speicherkontos können Sie das Azure-Portal oder die Azure CLI verwenden.
az storage account create \
--resource-group <resource-group-name> \
--name <storage-account-name> \
--location <location>
Ihre Speicherkonto-URL, die anschließend als <your-storage-account-url>
identifiziert wird, wird wie folgt formatiert: http(s)://<storage-account-name>.blob.core.windows.net
Authentifizieren des Clients
Um mit dem Speicherdienst (Blob, Queue, Message, MessageId, File) zu interagieren, müssen Sie eine instance der Service Client-Klasse erstellen. Um dies zu ermöglichen, benötigen Sie die Konto-SAS-Zeichenfolge (Shared Access Signature) des Speicherkontos. Weitere Informationen finden Sie unter SAS Token.
Abrufen von Anmeldeinformationen
SAS-Token
a. Verwenden Sie den folgenden Azure CLI-Codeausschnitt, um das SAS-Token aus dem Speicherkonto abzurufen.
az storage blob generate-sas \
--account-name {Storage Account name} \
--container-name {container name} \
--name {blob name} \
--permissions {permissions to grant} \
--expiry {datetime to expire the SAS token} \
--services {storage services the SAS allows} \
--resource-types {resource types the SAS allows}
Beispiel:
CONNECTION_STRING=<connection-string>
az storage blob generate-sas \
--account-name MyStorageAccount \
--container-name MyContainer \
--name MyBlob \
--permissions racdw \
--expiry 2020-06-15
b. Alternativ können Sie das KONTO-SAS-Token aus dem Azure-Portal abrufen.
- Wechseln Sie zu Ihrem Speicherkonto.
- Wählen Sie
Shared access signature
aus dem Menü auf der linken Seite aus. - Klicken Sie auf
Generate SAS and connection string
(nach dem Setup)
Anmeldeinformationen für freigegebene Schlüssel
a. Verwenden Sie Kontoname und Kontoschlüssel. Kontoname ist Der Name Ihres Speicherkontos.
- Wechseln Sie zu Ihrem Speicherkonto.
- Wählen Sie
Access keys
aus dem Menü auf der linken Seite aus. - Unter
key1
/key2
Kopieren des FeldinhaltsKey
oder
b. Verwenden Sie die Verbindungszeichenfolge.
- Wechseln Sie zu Ihrem Speicherkonto.
- Wählen Sie
Access keys
aus dem Menü auf der linken Seite aus. - Unter
key1
/key2
Kopieren des FeldinhaltsConnection string
Wichtige Begriffe
Blob Storage ist für Folgendes konzipiert:
- Speichern von Bildern oder Dokumenten direkt auf einem Browser
- Speichern von Dateien für verteilten Zugriff
- Video- und Audiostreaming
- Schreiben in Protokolldateien
- Speichern von Daten für Sicherung und Wiederherstellung, Notfallwiederherstellung und Archivierung
- Speichern von Daten für Analysen durch einen lokalen oder von Azure gehosteten Dienst
URL-Format
Blobs können mit dem folgenden URL-Format adressiert werden: Die folgende URL adressiert ein Blob:
https://myaccount.blob.core.windows.net/mycontainer/myblob
Syntax von Ressourcen-URIs
Für das Speicherkonto enthält der Basis-URI für Blobvorgänge nur den Namen des Kontos:
https://myaccount.blob.core.windows.net
Bei einem Container enthält der Basis-URI den Namen des Kontos und den Namen des Containers:
https://myaccount.blob.core.windows.net/mycontainer
Für ein Blob enthält der Basis-URI den Namen des Kontos, den Namen des Containers und den Namen des Blobs:
https://myaccount.blob.core.windows.net/mycontainer/myblob
Beachten Sie, dass die oben genannten URIs für komplexere Szenarien wie benutzerdefinierte Domänennamen möglicherweise nicht enthalten sind.
Beispiele
Die folgenden Abschnitte enthalten mehrere Codeausschnitte, die einige der gängigsten Azure Storage-Blobaufgaben behandeln, einschließlich:
- Erstellen eines
BlobServiceClient
- Erstellen eines
BlobContainerClient
- Erstellen eines
BlobClient
- Container erstellen
- Hochladen von Daten in ein Blob
- Hochladen eines Blobs aus einem Stream
- Hochladen eines Blobs aus dem lokalen Pfad
- Hochladen eines Blobs, falls noch nicht vorhanden
- Laden Sie ein Blob hoch, und überschreiben Sie es, wenn es bereits vorhanden ist.
- Hochladen eines Blobs über ein
OutputStream
- Herunterladen von Daten aus einem Blob
- Herunterladen eines Blobs in einen Stream
- Herunterladen eines Blobs in einen lokalen Pfad
- Lesen eines Blobs über einen
InputStream
- Auflisten von Blobs
- Kopieren eines Blobs
- Generieren eines SAS-Tokens
- Authentifizieren mit einer Azure-Identität
- Festlegen eines Proxys beim Erstellen eines Clients
Erstellen der Datei BlobServiceClient
Erstellen Sie eine BlobServiceClient
mithilfe der sasToken
oben generierten.
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("<your-storage-account-url>")
.sasToken("<your-sasToken>")
.buildClient();
oder
// Only one "?" is needed here. If the SAS token starts with "?", please removing one "?".
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("<your-storage-account-url>" + "?" + "<your-sasToken>")
.buildClient();
Erstellen der Datei BlobContainerClient
Erstellen Sie mithilfe von BlobContainerClient
.BlobServiceClient
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient("mycontainer");
Erstellen Sie einen BlobContainerClient
aus dem oben generierten Generator sasToken
.
BlobContainerClient blobContainerClient = new BlobContainerClientBuilder()
.endpoint("<your-storage-account-url>")
.sasToken("<your-sasToken>")
.containerName("mycontainer")
.buildClient();
oder
// Only one "?" is needed here. If the SAS token starts with "?", please removing one "?".
BlobContainerClient blobContainerClient = new BlobContainerClientBuilder()
.endpoint("<your-storage-account-url>" + "/" + "mycontainer" + "?" + "<your-sasToken>")
.buildClient();
Erstellen der Datei BlobClient
Erstellen Sie mithilfe von BlobClient
.BlobContainerClient
BlobClient blobClient = blobContainerClient.getBlobClient("myblob");
oder
Erstellen Sie einen BlobClient
aus dem oben generierten Generator sasToken
.
BlobClient blobClient = new BlobClientBuilder()
.endpoint("<your-storage-account-url>")
.sasToken("<your-sasToken>")
.containerName("mycontainer")
.blobName("myblob")
.buildClient();
oder
// Only one "?" is needed here. If the SAS token starts with "?", please removing one "?".
BlobClient blobClient = new BlobClientBuilder()
.endpoint("<your-storage-account-url>" + "/" + "mycontainer" + "/" + "myblob" + "?" + "<your-sasToken>")
.buildClient();
Erstellen eines Containers
Erstellen Sie einen Container mit einem BlobServiceClient
.
blobServiceClient.createBlobContainer("mycontainer");
oder
Erstellen Sie einen Container mit einem BlobContainerClient
.
blobContainerClient.create();
Hochladen von Daten in ein Blob
Laden Sie BinaryData
in ein Blob hoch, indem Sie ein BlobClient
aus einem BlobContainerClient
generierten verwenden.
BlobClient blobClient = blobContainerClient.getBlobClient("myblockblob");
String dataSample = "samples";
blobClient.upload(BinaryData.fromString(dataSample));
Hochladen eines Blobs aus einem Stream
Laden Sie aus einem InputStream
in ein Blob hoch, indem Sie ein BlockBlobClient
aus einem generierten BlobContainerClient
verwenden.
BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient("myblockblob").getBlockBlobClient();
String dataSample = "samples";
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
blockBlobClient.upload(dataStream, dataSample.length());
} catch (IOException e) {
e.printStackTrace();
}
Hochladen eines Blobs aus dem lokalen Pfad
Laden Sie eine Datei mit BlobClient
einem aus einem generierten in ein Blob hoch BlobContainerClient
.
BlobClient blobClient = blobContainerClient.getBlobClient("myblockblob");
blobClient.uploadFromFile("local-file.jpg");
Hochladen eines Blobs, falls noch kein Blob vorhanden ist
Laden Sie Daten in ein Blob hoch, und schlagen Sie fehl, wenn bereits eine vorhanden ist.
/*
* Rather than use an if block conditioned on an exists call, there are three ways to upload-if-not-exists using
* one network call instead of two. Equivalent options are present on all upload methods.
*/
// 1. The minimal upload method defaults to no overwriting
String dataSample = "samples";
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
blobClient.upload(dataStream, dataSample.length());
} catch (IOException e) {
e.printStackTrace();
}
// 2. The overwrite flag can explicitly be set to false to make intention clear
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
blobClient.upload(dataStream, dataSample.length(), false /* overwrite */);
} catch (IOException e) {
e.printStackTrace();
}
// 3. If the max overload is needed, access conditions must be used to prevent overwriting
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
BlobParallelUploadOptions options =
new BlobParallelUploadOptions(dataStream, dataSample.length());
// Setting IfNoneMatch="*" ensures the upload will fail if there is already a blob at the destination.
options.setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
blobClient.uploadWithResponse(options, null, Context.NONE);
} catch (IOException e) {
e.printStackTrace();
}
Hochladen eines Blobs und Überschreiben, falls bereits vorhanden
Laden Sie Daten in ein Blob hoch, und überschreiben Sie alle vorhandenen Daten am Ziel.
/*
* Rather than use an if block conditioned on an exists call, there are three ways to upload-if-exists in one
* network call instead of two. Equivalent options are present on all upload methods.
*/
String dataSample = "samples";
// 1. The overwrite flag can explicitly be set to true. This will succeed as a create and overwrite.
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
blobClient.upload(dataStream, dataSample.length(), true /* overwrite */);
} catch (IOException e) {
e.printStackTrace();
}
/*
* 2. If the max overload is needed and no access conditions are passed, the upload will succeed as both a
* create and overwrite.
*/
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
BlobParallelUploadOptions options =
new BlobParallelUploadOptions(dataStream, dataSample.length());
blobClient.uploadWithResponse(options, null, Context.NONE);
} catch (IOException e) {
e.printStackTrace();
}
/*
* 3. If the max overload is needed, access conditions may be used to assert that the upload is an overwrite and
* not simply a create.
*/
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(dataSample.getBytes())) {
BlobParallelUploadOptions options =
new BlobParallelUploadOptions(dataStream, dataSample.length());
// Setting IfMatch="*" ensures the upload will succeed only if there is already a blob at the destination.
options.setRequestConditions(new BlobRequestConditions().setIfMatch("*"));
blobClient.uploadWithResponse(options, null, Context.NONE);
} catch (IOException e) {
e.printStackTrace();
}
Hochladen eines Blobs über ein OutputStream
Laden Sie ein Blob hoch, indem Sie ein BlobOutputStream
öffnen und über Standardstream-APIs in das Blob schreiben.
/*
* Opening a blob input stream allows you to write to a blob through a normal stream interface. It will not be
* committed until the stream is closed.
* This option is convenient when the length of the data is unknown.
* This can only be done for block blobs. If the target blob already exists as another type of blob, it will
* fail.
*/
try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {
blobOS.write(new byte[0]);
} catch (IOException e) {
e.printStackTrace();
}
Herunterladen von Daten aus einem Blob
Laden Sie ein Blob mithilfe von in ein OutputStream
herunter BlobClient
.
BinaryData content = blobClient.downloadContent();
Herunterladen eines Blobs in einen Stream
Laden Sie ein Blob mithilfe von in ein OutputStream
herunter BlobClient
.
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
blobClient.downloadStream(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
Herunterladen eines Blobs in den lokalen Pfad
Laden Sie das Blob mithilfe von in eine lokale Datei herunter BlobClient
.
blobClient.downloadToFile("downloaded-file.jpg");
Lesen eines Blobs über einen InputStream
Laden Sie ein Blob herunter, indem Sie ein BlobInputStream
öffnen und über Standardstream-APIs lesen.
/*
* Opening a blob input stream allows you to read from a blob through a normal stream interface. It is also
* mark-able.
*/
try (BlobInputStream blobIS = blobClient.openInputStream()) {
blobIS.read();
} catch (IOException e) {
e.printStackTrace();
}
Auflisten von Blobs
Auflisten aller Blobs mithilfe von BlobContainerClient
.
for (BlobItem blobItem : blobContainerClient.listBlobs()) {
System.out.println("This is the blob name: " + blobItem.getName());
}
oder
Listen Sie alle Blobs auf, und erstellen Sie neue Clients, die auf die Elemente zeigen.
for (BlobItem blobItem : blobContainerClient.listBlobs()) {
BlobClient blobClient;
if (blobItem.getSnapshot() != null) {
blobClient = blobContainerClient.getBlobClient(blobItem.getName(), blobItem.getSnapshot());
} else {
blobClient = blobContainerClient.getBlobClient(blobItem.getName());
}
System.out.println("This is the new blob uri: " + blobClient.getBlobUrl());
}
Kopieren eines Blobs
Kopieren eines Blobs. Weitere Informationen zu den Anforderungen an die Kopierquelle und deren Authentifizierung finden Sie in den Javadocs für jede dieser Methoden.
SyncPoller<BlobCopyInfo, Void> poller = blobClient.beginCopy("<url-to-blob>", Duration.ofSeconds(1));
poller.waitForCompletion();
oder
blobClient.copyFromUrl("url-to-blob");
Generieren eines SAS-Tokens
Verwenden Sie eine instance eines Clients, um ein neues SAS-Token zu generieren.
/*
* Generate an account sas. Other samples in this file will demonstrate how to create a client with the sas
* token.
*/
// Configure the sas parameters. This is the minimal set.
OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
AccountSasPermission accountSasPermission = new AccountSasPermission().setReadPermission(true);
AccountSasService services = new AccountSasService().setBlobAccess(true);
AccountSasResourceType resourceTypes = new AccountSasResourceType().setObject(true);
// Generate the account sas.
AccountSasSignatureValues accountSasValues =
new AccountSasSignatureValues(expiryTime, accountSasPermission, services, resourceTypes);
String sasToken = blobServiceClient.generateAccountSas(accountSasValues);
// Generate a sas using a container client
BlobContainerSasPermission containerSasPermission = new BlobContainerSasPermission().setCreatePermission(true);
BlobServiceSasSignatureValues serviceSasValues =
new BlobServiceSasSignatureValues(expiryTime, containerSasPermission);
blobContainerClient.generateSas(serviceSasValues);
// Generate a sas using a blob client
BlobSasPermission blobSasPermission = new BlobSasPermission().setReadPermission(true);
serviceSasValues = new BlobServiceSasSignatureValues(expiryTime, blobSasPermission);
blobClient.generateSas(serviceSasValues);
Authentifizieren mit einer Azure-Identität
Die Azure Identity-Bibliothek bietet Azure Active Directory-Unterstützung für die Authentifizierung mit Azure Storage.
BlobServiceClient blobStorageClient = new BlobServiceClientBuilder()
.endpoint("<your-storage-account-url>")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
Festlegen eines Proxys beim Erstellen eines Clients
ProxyOptions options = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 888));
BlobServiceClient client = new BlobServiceClientBuilder()
.httpClient(new NettyAsyncHttpClientBuilder().proxy(options).build())
.buildClient();
oder
Lassen Sie es dem Client-Generator zu, den HttpClient
zu verwendenden Typ zu bestimmen, aber erstellen Sie ihn mit übergebenen Konfigurationen.
HttpClientOptions clientOptions = new HttpClientOptions()
.setProxyOptions(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 888)));
BlobServiceClient client = new BlobServiceClientBuilder()
.clientOptions(clientOptions)
.buildClient();
Problembehandlung
Bei der Interaktion mit Blobs mithilfe dieser Java-Clientbibliothek entsprechen vom Dienst zurückgegebene Fehler denselben HTTP-status Codes, die für REST-API-Anforderungen zurückgegeben werden. Wenn Sie beispielsweise versuchen, einen Container oder Blob abzurufen, der in Ihrem Speicherkonto nicht vorhanden ist, wird ein 404
Fehler zurückgegeben, der angibt Not Found
.
HTTP-Standardclient
Alle Clientbibliotheken verwenden standardmäßig den Netty-HTTP-Client. Durch Hinzufügen der obigen Abhängigkeit wird die Clientbibliothek automatisch für die Verwendung des Netty-HTTP-Clients konfiguriert. Das Konfigurieren oder Ändern des HTTP-Clients wird detailliert im Wiki zu HTTP-Clients beschrieben.
SSL-Standardbibliothek
Alle Clientbibliotheken verwenden standardmäßig die Tomcat-native Boring-SSL-Bibliothek, um die Leistung auf nativer Ebene für SSL-Vorgänge zu ermöglichen. Die Boring-SSL-Bibliothek ist eine Uber-JAR-Datei mit nativen Bibliotheken für Linux/macOS/Windows und bietet im Vergleich zur SSL-Standardimplementierung im JDK eine bessere Leistung. Weitere Informationen, einschließlich zur Reduzierung der Abhängigkeitsgröße, finden Sie im Abschnitt Leistungsoptimierung des Wikis.
Nächste Schritte
Im GitHub-Repository des SDK stehen Ihnen mehrere Beispiele für Das Java SDK für Storage-Blobs zur Verfügung. Diese Beispiele enthalten Beispielcode für zusätzliche Szenarien, die häufig bei der Arbeit mit Key Vault auftreten:
Beispiele für nächste Schritte
Die Beispiele werden hier ausführlich erläutert.
Mitwirken
Beiträge und Vorschläge für dieses Projekt sind willkommen. Für die meisten Beiträge ist die Zustimmung zu einer Lizenzvereinbarung für Mitwirkende (Contributor License Agreement, CLA) erforderlich, in der Sie erklären, dass Sie dazu berechtigt sind, uns die Rechte für die Nutzung Ihres Beitrags zu erteilen, und dies auch tun.
Wenn Sie einen Pull Request (PR) übermitteln, überprüft ein CLA-Bot automatisch, ob Sie eine Lizenzvereinbarung bereitstellen und den PR entsprechend ergänzen müssen (z.B. mit einer Bezeichnung oder einem Kommentar). Führen Sie einfach die Anweisungen des Bots aus. Sie müssen dies nur einmal für alle Repositorys ausführen, die unsere CLA verwenden.
Für dieses Projekt gelten die Microsoft-Verhaltensregeln für Open Source (Microsoft Open Source Code of Conduct). Weitere Informationen finden Sie in den häufig gestellten Fragen zum Verhaltenskodex. Sie können sich auch an opencode@microsoft.com wenden, wenn Sie weitere Fragen oder Anmerkungen haben.