@azure/storage-file-share (TypeScript/JavaScript)
SDK pour les opérations Azure File Share — partages de fichiers SMB, répertoires et opérations sur fichiers.
Installation
npm install @azure/storage-file-share @azure/identity
Version actuelle : 12.x
Node.js : >= 18.0.0
Variables d'environnement
AZURE_STORAGE_ACCOUNT_NAME=<account-name>
AZURE_STORAGE_ACCOUNT_KEY=<account-key>
# OU chaîne de connexion
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production
Authentification
Chaîne de connexion (La plus simple)
import { ShareServiceClient } from "@azure/storage-file-share";
const client = ShareServiceClient.fromConnectionString(
process.env.AZURE_STORAGE_CONNECTION_STRING!
);
StorageSharedKeyCredential (Node.js uniquement)
import { ShareServiceClient, StorageSharedKeyCredential } from "@azure/storage-file-share";
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;
const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
const client = new ShareServiceClient(
`https://${accountName}.file.core.windows.net`,
sharedKeyCredential
);
Identifiant de jeton Microsoft Entra
import { ShareServiceClient } from "@azure/storage-file-share";
import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity";
// Dev local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});
// Ou utiliser un identifiant spécifique directement en production :
// Voir https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes
// const credential = new ManagedIdentityCredential();
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const client = new ShareServiceClient(
`https://${accountName}.file.core.windows.net`,
credential
);
Jeton SAS
import { ShareServiceClient } from "@azure/storage-file-share";
const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;
const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!;
const client = new ShareServiceClient(
`https://${accountName}.file.core.windows.net${sasToken}`
);
Hiérarchie des clients
ShareServiceClient (niveau compte)
└── ShareClient (niveau partage)
└── ShareDirectoryClient (niveau répertoire)
└── ShareFileClient (niveau fichier)
Opérations sur partages
Créer un partage
const shareClient = client.getShareClient("my-share");
await shareClient.create();
// Créer avec quota (en Go)
await shareClient.create({ quota: 100 });
Lister les partages
for await (const share of client.listShares()) {
console.log(share.name, share.properties.quota);
}
// Avec filtre de préfixe
for await (const share of client.listShares({ prefix: "logs-" })) {
console.log(share.name);
}
Supprimer un partage
await shareClient.delete();
// Supprimer s'il existe
await shareClient.deleteIfExists();
Obtenir les propriétés du partage
const properties = await shareClient.getProperties();
console.log("Quota:", properties.quota, "GB");
console.log("Last Modified:", properties.lastModified);
Définir le quota du partage
await shareClient.setQuota(200); // 200 Go
Opérations sur répertoires
Créer un répertoire
const directoryClient = shareClient.getDirectoryClient("my-directory");
await directoryClient.create();
// Créer un répertoire imbriqué
const nestedDir = shareClient.getDirectoryClient("parent/child/grandchild");
await nestedDir.create();
Lister les répertoires et fichiers
const directoryClient = shareClient.getDirectoryClient("my-directory");
for await (const item of directoryClient.listFilesAndDirectories()) {
if (item.kind === "directory") {
console.log(`[DIR] ${item.name}`);
} else {
console.log(`[FILE] ${item.name} (${item.properties.contentLength} bytes)`);
}
}
Supprimer un répertoire
await directoryClient.delete();
// Supprimer s'il existe
await directoryClient.deleteIfExists();
Vérifier si un répertoire existe
const exists = await directoryClient.exists();
if (!exists) {
await directoryClient.create();
}
Opérations sur fichiers
Charger un fichier (Simple)
const fileClient = shareClient
.getDirectoryClient("my-directory")
.getFileClient("my-file.txt");
// Charger une chaîne
const content = "Hello, World!";
await fileClient.create(content.length);
await fileClient.uploadRange(content, 0, content.length);
Charger un fichier (Node.js - à partir d'un fichier local)
import * as fs from "fs";
import * as path from "path";
const fileClient = shareClient.rootDirectoryClient.getFileClient("uploaded.txt");
const localFilePath = "/path/to/local/file.txt";
const fileSize = fs.statSync(localFilePath).size;
await fileClient.create(fileSize);
await fileClient.uploadFile(localFilePath);
Charger un fichier (Buffer)
const buffer = Buffer.from("Hello, Azure Files!");
const fileClient = shareClient.rootDirectoryClient.getFileClient("buffer-file.txt");
await fileClient.create(buffer.length);
await fileClient.uploadRange(buffer, 0, buffer.length);
Charger un fichier (Stream)
import * as fs from "fs";
const fileClient = shareClient.rootDirectoryClient.getFileClient("streamed.txt");
const readStream = fs.createReadStream("/path/to/local/file.txt");
const fileSize = fs.statSync("/path/to/local/file.txt").size;
await fileClient.create(fileSize);
await fileClient.uploadStream(readStream, fileSize, 4 * 1024 * 1024, 4); // Buffer 4 Mo, concurrence 4
Télécharger un fichier
const fileClient = shareClient
.getDirectoryClient("my-directory")
.getFileClient("my-file.txt");
const downloadResponse = await fileClient.download();
// Lire comme chaîne
const chunks: Buffer[] = [];
for await (const chunk of downloadResponse.readableStreamBody!) {
chunks.push(Buffer.from(chunk));
}
const content = Buffer.concat(chunks).toString("utf-8");
Télécharger vers un fichier (Node.js)
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
await fileClient.downloadToFile("/path/to/local/destination.txt");
Télécharger vers un Buffer (Node.js)
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
const buffer = await fileClient.downloadToBuffer();
console.log(buffer.toString());
Supprimer un fichier
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
await fileClient.delete();
// Supprimer s'il existe
await fileClient.deleteIfExists();
Copier un fichier
const sourceUrl = "https://account.file.core.windows.net/share/source.txt";
const destFileClient = shareClient.rootDirectoryClient.getFileClient("destination.txt");
// Démarrer l'opération de copie
const copyPoller = await destFileClient.startCopyFromURL(sourceUrl);
await copyPoller.pollUntilDone();
Propriétés et métadonnées de fichiers
Obtenir les propriétés du fichier
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
const properties = await fileClient.getProperties();
console.log("Content-Length:", properties.contentLength);
console.log("Content-Type:", properties.contentType);
console.log("Last Modified:", properties.lastModified);
console.log("ETag:", properties.etag);
Définir les métadonnées
await fileClient.setMetadata({
author: "John Doe",
category: "documents",
});
Définir les en-têtes HTTP
await fileClient.setHttpHeaders({
fileContentType: "text/plain",
fileCacheControl: "max-age=3600",
fileContentDisposition: "attachment; filename=download.txt",
});
Opérations sur plages
Charger une plage
const data = Buffer.from("partial content");
await fileClient.uploadRange(data, 100, data.length); // Écrire au décalage 100
Télécharger une plage
const downloadResponse = await fileClient.download(100, 50); // décalage 100, longueur 50
Effacer une plage
await fileClient.clearRange(0, 100); // Effacer les 100 premiers octets
Opérations sur snapshots
Créer un snapshot
const snapshotResponse = await shareClient.createSnapshot();
console.log("Snapshot:", snapshotResponse.snapshot);
Accéder à un snapshot
const snapshotShareClient = shareClient.withSnapshot(snapshotResponse.snapshot!);
const snapshotFileClient = snapshotShareClient.rootDirectoryClient.getFileClient("file.txt");
const content = await snapshotFileClient.downloadToBuffer();
Supprimer un snapshot
await shareClient.delete({ deleteSnapshots: "include" });
Génération de jeton SAS (Node.js uniquement)
Générer un SAS de fichier
import {
generateFileSASQueryParameters,
FileSASPermissions,
StorageSharedKeyCredential,
} from "@azure/storage-file-share";
const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);
const sasToken = generateFileSASQueryParameters(
{
shareName: "my-share",
filePath: "my-directory/my-file.txt",
permissions: FileSASPermissions.parse("r"), // lecture seule
expiresOn: new Date(Date.now() + 3600 * 1000), // 1 heure
},
sharedKeyCredential
).toString();
const sasUrl = `https://${accountName}.file.core.windows.net/my-share/my-directory/my-file.txt?${sasToken}`;
Générer un SAS de partage
import { ShareSASPermissions, generateFileSASQueryParameters } from "@azure/storage-file-share";
const sasToken = generateFileSASQueryParameters(
{
shareName: "my-share",
permissions: ShareSASPermissions.parse("rcwdl"), // lecture, création, écriture, suppression, listage
expiresOn: new Date(Date.now() + 24 * 3600 * 1000), // 24 heures
},
sharedKeyCredential
).toString();
Gestion des erreurs
import { RestError } from "@azure/storage-file-share";
try {
await shareClient.create();
} catch (error) {
if (error instanceof RestError) {
switch (error.statusCode) {
case 404:
console.log("Partage non trouvé");
break;
case 409:
console.log("Le partage existe déjà");
break;
case 403:
console.log("Accès refusé");
break;
default:
console.error(`Erreur de stockage ${error.statusCode}: ${error.message}`);
}
}
throw error;
}
Référence des types TypeScript
import {
// Clients
ShareServiceClient,
ShareClient,
ShareDirectoryClient,
ShareFileClient,
// Authentification
StorageSharedKeyCredential,
AnonymousCredential,
// SAS
FileSASPermissions,
ShareSASPermissions,
AccountSASPermissions,
AccountSASServices,
AccountSASResourceTypes,
generateFileSASQueryParameters,
generateAccountSASQueryParameters,
// Options et réponses
ShareCreateResponse,
FileDownloadResponseModel,
DirectoryItem,
FileItem,
ShareProperties,
FileProperties,
// Erreurs
RestError,
} from "@azure/storage-file-share";
Bonnes pratiques
- Utiliser les chaînes de connexion pour la simplicité — Configuration la plus facile pour le développement
- Utiliser
DefaultAzureCredentialpour le développement local ; utiliserManagedIdentityCredentialouWorkloadIdentityCredentialpour la production - Définir des quotas sur les partages — Prévenir les coûts de stockage inattendus
- Utiliser le streaming pour les gros fichiers —
uploadStream/downloadToFilepour les fichiers > 256 Mo - Utiliser les plages pour les mises à jour partielles — Plus efficace que le remplacement complet du fichier
- Créer des snapshots avant les changements majeurs — Récupération à un moment donné
- Gérer les erreurs correctement — Vérifier
RestError.statusCodepour un traitement spécifique - *Utiliser les méthodes `IfExists`** — Pour les opérations idempotentes
Différences entre plateformes
| Fonctionnalité | Node.js | Navigateur |
|---|---|---|
StorageSharedKeyCredential |
✅ | ❌ |
uploadFile() |
✅ | ❌ |
uploadStream() |
✅ | ❌ |
downloadToFile() |
✅ | ❌ |
downloadToBuffer() |
✅ | ❌ |
| Génération SAS | ✅ | ❌ |
| DefaultAzureCredential | ✅ | ❌ |
| Accès anonyme/SAS | ✅ | ✅ |