Karşıya yükleme, indirme ve Node.js v2 için istemci kitaplığını kullanarak blobları ListeleHow to upload, download, and list blobs using the client library for Node.js v2

Bu nasıl yapılır kılavuzunda, karşıya yükleme, indirme ve Azure Blob Depolama ile blobları listeleme Node.js v2 için istemci kitaplığını kullanmayı öğrenin.In this how-to guide, you learn how to use the client library for Node.js v2 to upload, download, and list blobs with Azure Blob storage.

İpucu

Node.js için Azure depolama istemci Kitaplığı'nın en son sürümü v10 ' dir.The latest version of the Azure Storage client library for Node.js is v10. Microsoft, mümkün olduğunda istemci Kitaplığı'nın en son sürümünü kullanmanızı önerir.Microsoft recommends that you use the latest version of the client library when possible. V10 kullanmaya başlamak için bkz: hızlı başlangıç: Yükleme, indirme, liste ve JavaScript v10 için Azure depolama istemci kitaplığı kullanarak blobları silme (Önizleme).To get started using v10, see Quickstart: Upload, download, list, and delete blobs using Azure Storage client library for JavaScript v10 (preview).

ÖnkoşullarPrerequisites

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.If you don't have an Azure subscription, create a free account before you begin.

Bir Azure depolama hesabı oluşturun Azure portalında.Create an Azure storage account in the Azure portal. Hesap oluşturmayla ilgili yardım için bkz. Depolama hesabı oluşturma.For help creating the account, see Create a storage account.

Örnek uygulamayı indirin:Download the sample application

Örnek uygulama basit bir Node.js konsol uygulamasıdır.The sample application is a simple Node.js console application. Başlamak için, aşağıdaki komutu kullanarak depoyu makinenize kopyalayın:To begin, clone the repository to your machine using the following command:

git clone https://github.com/Azure-Samples/storage-blobs-node-quickstart.git

Uygulamayı açmak için, storage-blobs-node-quickstart klasörünü arayın ve sık kullandığınız kod düzenleme ortamınızda açın.To open the application, look for the storage-blobs-node-quickstart folder and open it in your favorite code editing environment.

Azure portalından kimlik bilgilerinizi kopyalamaCopy your credentials from the Azure portal

Örnek uygulamanın, depolama hesabınıza erişim için kimlik doğrulaması gerçekleştirmesi gerekir.The sample application needs to authenticate access to your storage account. Kimlik doğrulaması gerçekleştirmek için, depolama hesabınızın kimlik bilgilerini uygulamaya bir bağlantı dizesi olarak ekleyin.To authenticate, add your storage account credentials to the application as a connection string. Bu adımları izleyerek depolama hesabı kimlik bilgilerinizi görüntüleyin:View your storage account credentials by following these steps:

  1. Azure portalına gidin.Navigate to the Azure portal.

  2. Depolama hesabınızı bulun.Locate your storage account.

  3. Depolama hesabına genel bakışın Ayarlar bölümünde Erişim anahtarları’nı seçin.In the Settings section of the storage account overview, select Access keys. Burada, hesap erişim anahtarlarınızı ve her anahtar için tam bağlantı dizesini görüntüleyebilirsiniz.Here, you can view your account access keys and the complete connection string for each key.

  4. key1 bölümünde Bağlantı dizesi değerini bulun ve Kopyala düğmesini seçerek bağlantı dizesini kopyalayın.Find the Connection string value under key1, and select the Copy button to copy the connection string. Sonraki adımda bir ortam değişkenine bağlantı dizesini ekleyeceksiniz.You will add the connection string value to an environment variable in the next step.

    Azure portalından bağlantı dizesinin kopyalanmasını gösteren ekran görüntüsü

Depolama bağlantı dizelerinizi yapılandırmaConfigure your storage connection string

Uygulamayı çalıştırmadan önce, depolama hesabınız için bağlantı dizesi sağlamanız gerekir.Before running the application, you must provide the connection string for your storage account. Örnek depo, .env.example adlı bir dosya içerir.The sample repository includes a file named .env.example. .example uzantısını kaldırarak bu dosyayı yeniden adlandırabilirsiniz. Böylece .env adlı bir dosya elde edilir.You can rename this file by removing the .example extension, which results in a file named .env. .env dosyasının içinde, AZURE_STORAGE_CONNECTION_STRING anahtarının sonrasına bağlantı dizesi değerinizi ekleyin.Inside the .env file, add your connection string value after the AZURE_STORAGE_CONNECTION_STRING key.

Gerekli paketleri yüklemeInstall required packages

Uygulama dizininde npm install komutunu çalıştırarak uygulama için gerekli paketleri yükleyin.In the application directory, run npm install to install the required packages for the application.

npm install

Örneği çalıştırmaRun the sample

Bağımlılıklar yüklendiğine göre aşağıdaki komutu göndererek örneği çalıştırabilirsiniz:Now that the dependencies are installed, you can run the sample by issuing the following command:

npm start

Betikten çıkış şununla benzerlik gösterecektir:The output from the script will be similar to the following:

Containers:
 - container-one
 - container-two
Container "demo" is created
Blob "quickstart.txt" is uploaded
Local file "./readme.md" is uploaded
Blobs in "demo" container:
 - quickstart.txt
 - readme.md
Blob downloaded blob content: "hello Blob SDK"
Blob "quickstart.txt" is deleted
Container "demo" is deleted
Done

Bu örnek için yeni bir depolama hesabı kullanarak sonra etiketin altında listelenen herhangi bir kapsayıcı adı göremeyebilirsiniz "kapsayıcıları".If you are using a new storage account for this example, then you may not see any container names listed under the label "Containers".

Kodu anlamaUnderstanding the code

İlk ifade değerleri ortam değişkenlerine yüklemek için kullanılır.The first expression is used to load values into environment variables.

if (process.env.NODE_ENV !== 'production') {
    require('dotenv').load();
}

dotenv modülü uygulama hata ayıklama için yerel olarak çalıştırılırken ortam değişkenlerini yükler.The dotenv module loads environment variables when running the app locally for debugging. Değerler .env adlı bir dosyada tanımlanır ve geçerli yürütme bağlamına yüklenir.Values are defined in a file named .env and loaded into the current execution context. Üretim bağlamlarında, bu değerleri sunucu yapılandırması sağlar ve bu nedenle bu kod yalnızca betik bir “üretim” bağlamı altında çalıştırılmadığında çalıştırılır.In production contexts, the server configuration provides these values and that is why this code is only run when the script is not running under a "production" context.

const path = require('path');
const storage = require('azure-storage');

Modüllerin amacı aşağıdaki gibidir:The purpose of the modules is as follows:

.env adlı dosya geçerli yürütme bağlamınafile named .env into the current execution context

  • path, blob depolamaya yüklenecek dosyanın mutlak dosya yolunu belirlemek için gereklidirpath is required in order to determine the absolute file path of the file to upload to blob storage
  • Azure depolama olduğu Azure depolama istemci Kitaplığı Node.js için Modülüazure-storage is the Azure Storage client library module for Node.js

Daha sonra, blobService değişkeni Azure Blob hizmetinin yeni bir örneği olarak başlatılır.Next, the blobService variable is initialized as a new instance of the Azure Blob service.

const blobService = storage.createBlobService();

Aşağıdaki uygulamada, blobService işlevlerinin her biri bir Promise içinde kaydırılır ve bu da Azure Depolama API’sinin geri çağrı yapısını kolaylaştırmak için JavaScript'in async işlevine ve await işlecine erişilmesini sağlar.In the following implementation, each of the blobService functions is wrapped in a Promise, which allows access to JavaScript's async function and await operator to streamline the callback nature of the Azure Storage API. Her bir işlev için başarılı bir yanıt döndürüldüğünde Promise, eyleme özgü bir iletiyle birlikte alakalı verilerle çözümleme gerçekleştirir.When a successful response returns for each function, the promise resolves with relevant data along with a message specific to the action.

Kapsayıcıları listelemeList containers

listContainers işlevi gruplar içindeki kapsayıcıların koleksiyonlarını döndüren listContainersSegmented öğesini çağırır.The listContainers function calls listContainersSegmented which returns collections of containers in groups.

const listContainers = async () => {
    return new Promise((resolve, reject) => {
        blobService.listContainersSegmented(null, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `${data.entries.length} containers`, containers: data.entries });
            }
        });
    });
};

Grupların boyutu ListContainersOptions ile yapılandırılabilir.The size of the groups is configurable via ListContainersOptions. listContainersSegmented çağrıldığında, ContainerResult örnekleri dizisi olarak blob meta verileri döndürülür.Calling listContainersSegmented returns blob metadata as an array of ContainerResult instances. Sonuçlar, 5.000’er olarak artan toplu işler (segmentler) halinde döndürülür.Results are returned in 5,000 increment batches (segments). Bir kapsayıcıda 5.000’den fazla blob varsa, sonuçlar continuationToken için bir değer içerir.If there are more than 5,000 blobs in a container, then the results include a value for continuationToken. Blob kapsayıcısında yer alan sonraki segmentleri listelemek için, ikinci bağımsız değişken olarak devamlılık belirtecini listContainersSegment öğesine geri gönderebilirsiniz.To list subsequent segments from the blob container, you can pass the continuation token back into listContainersSegment as the second argument.

Bir kapsayıcı oluşturmaCreate a container

createContainer işlevi, createContainerIfNotExists öğesini çağırır ve blob için uygun erişim düzeyini ayarlar.The createContainer function calls createContainerIfNotExists and sets the appropriate access level for the blob.

const createContainer = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.createContainerIfNotExists(containerName, { publicAccessLevel: 'blob' }, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Container '${containerName}' created` });
            }
        });
    });
};

createContainerIfNotExists için ikinci parametre (options), publicAccessLevel için bir değer kabul eder.The second parameter (options) for createContainerIfNotExists accepts a value for publicAccessLevel. publicAccessLevel için blob değeri, belirli blob verilerinin genel kullanıma sunulduğunu belirtir.The value blob for publicAccessLevel specifies that specific blob data is exposed to the public. Bu ayar, kapsayıcının içeriklerini listeleme yeteneği sağlayan kapsayıcı düzeyinde erişimin tersidir.This setting is in contrast to container level access, which grants the ability to list the contents of the container.

createContainerIfNotExists kullanılması, kapsayıcı önceden mevcut olduğunda uygulamanın hata döndürmeden createContainer komutunu birçok defa çalıştırmasına olanak sağlar.The use of createContainerIfNotExists allows the application to run the createContainer command multiple times without returning errors when the container already exists. Üretim ortamında, uygulama genelinde aynı kapsayıcı kullanıldığında çoğu zaman createContainerIfNotExists komutunu yalnızca bir defa çağırırsınız.In a production environment, you often only call createContainerIfNotExists once as the same container is used throughout the application. Bu durumlarda, önceden portal veya Azure CLI aracılığıyla kapsayıcı oluşturabilirsiniz.In these cases, you can create the container ahead of time through the portal or via the Azure CLI.

Metni karşıya yüklemeUpload text

uploadString işlevi createBlockBlobFromText öğesini blob kapsayıcısına rastgele bir dize yazmak (veya dizenin üzerine yazmak) için çağırır.The uploadString function calls createBlockBlobFromText to write (or overwrite) an arbitrary string to the blob container.

const uploadString = async (containerName, blobName, text) => {
    return new Promise((resolve, reject) => {
        blobService.createBlockBlobFromText(containerName, blobName, text, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Text "${text}" is written to blob storage` });
            }
        });
    });
};

Yerel bir dosyayı karşıya yüklemeUpload a local file

uploadLocalFile işlevi, dosya sistemindeki bir dosyayı blob depolamaya yüklemek ve yazmak veya söz konusu dosyanın üzerine yazmak için createBlockBlobFromLocalFile işlevini kullanır.The uploadLocalFile function uses createBlockBlobFromLocalFile to upload and write (or overwrite) a file from the file system into blob storage.

const uploadLocalFile = async (containerName, filePath) => {
    return new Promise((resolve, reject) => {
        const fullPath = path.resolve(filePath);
        const blobName = path.basename(filePath);
        blobService.createBlockBlobFromLocalFile(containerName, blobName, fullPath, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Local file "${filePath}" is uploaded` });
            }
        });
    });
};

Bloblara içerik yüklemenin başka bir yolu da text ve streams ile çalışmaktır.Other approaches available to upload content into blobs include working with text and streams. Dosyanın blob depolamanıza yüklendiğini doğrulamak için Azure Depolama Gezgini’ni kullanarak hesabınızdaki verileri görüntüleyebilirsiniz.To verify the file is uploaded to your blob storage, you can use the Azure Storage Explorer to view the data in your account.

Blobları listelemeList the blobs

listBlobs işlevi, bir kapsayıcıdaki blob meta verileri listesini döndürmek için listBlobsSegmented yöntemini çağırır.The listBlobs function calls the listBlobsSegmented method to return a list of blob metadata in a container.

const listBlobs = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.listBlobsSegmented(containerName, null, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `${data.entries.length} blobs in '${containerName}'`, blobs: data.entries });
            }
        });
    });
};

listBlobsSegmented çağrıldığında, BlobResult örnekleri dizisi olarak blob meta verileri döndürülür.Calling listBlobsSegmented returns blob metadata as an array of BlobResult instances. Sonuçlar, 5.000’er olarak artan toplu işler (segmentler) halinde döndürülür.Results are returned in 5,000 increment batches (segments). Bir kapsayıcıda 5.000’den fazla blob varsa, sonuçlar continuationToken için bir değer içerir.If there are more than 5,000 blobs in a container, then the results include a value for continuationToken. Blob kapsayıcısında yer alan sonraki segmentleri listelemek için, ikinci bağımsız değişken olarak devamlılık belirtecini listBlobSegmented öğesine geri gönderebilirsiniz.To list subsequent segments from the blob container, you can pass the continuation token back into listBlobSegmented as the second argument.

Blob indirmeDownload a blob

downloadBlob işlevi, belirtilen mutlak dosya yoluna blobun içeriklerini indirmek için getBlobToText öğesini kullanır.The downloadBlob function uses getBlobToText to download the contents of the blob to the given absolute file path.

const downloadBlob = async (containerName, blobName) => {
    const dowloadFilePath = path.resolve('./' + blobName.replace('.txt', '.downloaded.txt'));
    return new Promise((resolve, reject) => {
        blobService.getBlobToText(containerName, blobName, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Blob downloaded "${data}"`, text: data });
            }
        });
    });
};

Burada gösterilen uygulama kaynağı değiştirir ve blob içeriklerini dize olarak döndürür.The implementation shown here changes the source returns the contents of the blob as a string. Blobu bir akış olarak veya doğrudan bir yerel dosyaya da indirebilirsiniz.You can also download the blob as a stream as well as directly to a local file.

Blob silmeDelete a blob

deleteBlob işlevi deleteBlobIfExists işlevini çağırır.The deleteBlob function calls the deleteBlobIfExists function. Adından da anlaşılacağı gibi bu işlev, blob önceden silindiyse bir hata döndürmez.As the name implies, this function does not return an error if the blob is already deleted.

const deleteBlob = async (containerName, blobName) => {
    return new Promise((resolve, reject) => {
        blobService.deleteBlobIfExists(containerName, blobName, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Block blob '${blobName}' deleted` });
            }
        });
    });
};

Kapsayıcı silmeDelete a container

Kapsayıcılar blob hizmetinden deleteContainer yöntemi çağrılıp kapsayıcı adı geçirilerek silinir.Containers are deleted by calling the deleteContainer method off the blob service and passing in the container name.

const deleteContainer = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.deleteContainer(containerName, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Container '${containerName}' deleted` });
            }
        });
    });
};

Kodu çağırmaCalling code

JavaScript'in async/await söz dizimini desteklemek için, tüm çağırma kodu execute adlı bir işlev içinde sarmalanır.In order to support JavaScript's async/await syntax, all the calling code is wrapped in a function named execute. Daha sonra yürütme çağrılır ve bir promise olarak işlenir.Then execute is called and handled as a promise.

async function execute() {
    // commands 
}

execute().then(() => console.log("Done")).catch((e) => console.log(e));

Aşağıdaki tüm kod // commands açıklamasının yerleştirildiği yürütme işlevinin içinde çalıştırılır.All of the following code runs inside the execute function where the // commands comment is placed.

İlk olarak, Blob deposuna karşıya yüklemek için ad ve örnek içerik atamak ve yerel dosyaya işaret etmek üzere ilgili değişkenler bildirilir.First, the relevant variables are declared to assign names, sample content and to point to the local file to upload to Blob storage.

const containerName = "demo";
const blobName = "quickstart.txt";
const content = "hello Node SDK";
const localFilePath = "./readme.md";
let response;

Depolama hesabındaki kapsayıcıları listelemek için, listContainers işlevi çağrılır ve döndürülen kapsayıcı listesi çıkış penceresine kaydedilir.To list the containers in the storage account, the listContainers function is called and the returned list of containers is logged to the output window.

console.log("Containers:");
response = await listContainers();
response.containers.forEach((container) => console.log(` -  ${container.name}`));

Kapsayıcılar listesi kullanılabilir duruma geldikten sonra, oluşturmak istediğiniz kapsayıcının zaten mevcut olup olmadığını öğrenmek için findIndex Dizisi yöntemini kullanabilirsiniz.Once the list of containers is available, then you can use the Array findIndex method to see if the container you want to create already exists. Kapsayıcı mevcut değilse oluşturulur.If the container does not exist then the container is created.

const containerDoesNotExist = response.containers.findIndex((container) => container.name === containerName) === -1;

if (containerDoesNotExist) {
    await createContainer(containerName);
    console.log(`Container "${containerName}" is created`);
}

Daha sonra, bir dize ve yerel bir dosya Blob depolamaya yüklenir.Next, a string and a local file is uploaded to Blob storage.

await uploadString(containerName, blobName, content);
console.log(`Blob "${blobName}" is uploaded`);

response = await uploadLocalFile(containerName, localFilePath);
console.log(response.message);

Blobları listelemek için işlem, kapsayıcıları listeleme ile aynıdır.The process to list blobs is the same as listing containers. listBlobs çağrısı kapsayıcıdaki blobların bir dizisini döndürür ve bunlar çıkış penceresine kaydedilir.The call to listBlobs returns an array of blobs in the container and are logged to the output window.

console.log(`Blobs in "${containerName}" container:`);
response = await listBlobs(containerName);
response.blobs.forEach((blob) => console.log(` - ${blob.name}`));

Bir blobu indirmek için, yanıt yakalanır ve blob değerine erişmek için kullanılır.To download a blob, the response is captured and used to access the value of the blob. Yanıttan readableStreamBody bir dizeye dönüştürülür ve çıkış penceresine kaydedilir.From the response readableStreamBody is converted to a string and logged out to the output window.

response = await downloadBlob(containerName, blobName);
console.log(`Downloaded blob content: "${response.text}"`);

Son olarak, blob ve kapsayıcı depolama hesabından silinir.Finally, the blob and container are deleted from the storage account.

await deleteBlob(containerName, blobName);
console.log(`Blob "${blobName}" is deleted`);

await deleteContainer(containerName);
console.log(`Container "${containerName}" is deleted`);

Kaynakları temizlemeClean up resources

Depolama hesabına yazılan tüm veriler kod örneğinin sonunda otomatik olarak silinir.All data written to the storage account is automatically deleted at the end of the code sample.

Bloblarla Node.js uygulamaları geliştirme kaynaklarıResources for developing Node.js applications with blobs

Blob depolama ile Node.js geliştirmeye yönelik şu ek kaynaklara bakın:See these additional resources for Node.js development with Blob storage:

İkili dosyalar ve kaynak koduBinaries and source code

İstemci kitaplığı başvurusu ve örnekleriClient library reference and samples

Sonraki adımlarNext steps

Bu makalede, yerel bir disk ve Node.js kullanarak Azure Blob Depolama arasında bir dosya karşıya yükleme gösterilmektedir.This article demonstrates how to upload a file between a local disk and Azure Blob storage using Node.js. Blob depolamayla çalışma hakkında daha fazla bilgi edinmek için, GitHub deposuyla devam edin.To learn more about working with Blob storage, continue to the GitHub repository.