node.jsazureazure-blob-storagestorage-file-share

Copy Azure File Share to Blob with node.js


Is there an example (in node.js) to copy an Azure File Share to Blob? Server to Server without downloading the file previously.

Thanks in advance.

My code:

    var arrFolders = [];
    arrFolders.push("");
    do 
    {
        let directoryName = arrFolders.pop();
        console.log(`List directories and files under directory ${directoryName}`);
        let i = 1;
        const directoryClient = shareClient.getDirectoryClient(directoryName);
        for await (const entity of directoryClient.listFilesAndDirectories()) 
        {
            if (entity.kind === "directory") 
            {
                console.log(`${i++} - directory\t: ${entity.name}`);
                arrFolders.push((directoryName=="") ? entity.name : directoryName + "\\" + entity.name);
            } 
            else 
            {
                console.log(`${i++} - file\t: ${entity.name}`);
                // Copy Files to Blob....
                // ?????
                
            }
        }
        
    } while (arrFolders.length > 0);
    console.log("End list directories and files");

Solution

  • If you want to copy Azure file to Azure Blob, we can use the rest API Copy Blob. enter image description here

    In the node sdk, we can use the method BlobClient.beginCopyFromURL in the package @azure/storage-blob to implement it.

    For example

    const { BlobServiceClient } = require("@azure/storage-blob");
    const {
      ShareClient,
      generateAccountSASQueryParameters,
      StorageSharedKeyCredential,
      AccountSASResourceTypes,
      AccountSASPermissions,
      AccountSASServices,
    } = require("@azure/storage-file-share");
    
    const fileAccountName = "";
    const fileAccountKey ="";
    
    const blobConStr ="";
    
    async function copy() {
      // create account sas token for file service
      var fileCreds = new StorageSharedKeyCredential(
        fileAccountName,
        fileAccountKey
      );
      var accountSas = generateAccountSASQueryParameters(
        {
          startsOn: new Date(new Date().valueOf() - 8640),
          expiresOn: new Date(new Date().valueOf() + 86400000),
          resourceTypes: AccountSASResourceTypes.parse("sco").toString(),
          permissions: AccountSASPermissions.parse("rwdlc").toString(),
          services: AccountSASServices.parse("f").toString(),
        },
        fileCreds
      ).toString();
    
      //get file share client
      var shareClient = new ShareClient(
        `https://${fileAccountName}.file.core.windows.net/<shareName>`,
        fileCreds
      );
      //get blob container client
      var blobServiceClient = BlobServiceClient.fromConnectionString(blobConStr);
      var containerClient = blobServiceClient.getContainerClient("<containerName>");
      await containerClient.createIfNotExists();
    
      // list files and copy files to azure blob
      var arrFolders = [];
      arrFolders.push("input");
      do {
        let directoryName = arrFolders.pop();
        console.log(`List directories and files under directory ${directoryName}`);
        let i = 1;
        const directoryClient = shareClient.getDirectoryClient(directoryName);
        for await (const entity of directoryClient.listFilesAndDirectories()) {
          if (entity.kind === "directory") {
            console.log(`${i++} - directory\t: ${entity.name}`);
            arrFolders.push(
              directoryName == "" ? entity.name : directoryName + "\\" + entity.name
            );
          } else {
            console.log(`${i++} - file\t: ${entity.name}`);
            var fileClient = directoryClient.getFileClient(entity.name);
            var soureUrl = fileClient.url + "?" + accountSas;
            try {
              var res = await (
                await containerClient
                  .getBlobClient(entity.name)
                  .beginCopyFromURL(soureUrl)
              ).pollUntilDone();
              console.log(res.copyStatus);
            } catch (error) {
              throw error;
            }
          }
        }
      } while (arrFolders.length > 0);
    }
    

    enter image description here