有没有一种方法可以通过名称末尾过滤蔚蓝Blob存储上的listBlobFlatSegment?

时间:2020-01-16 20:42:58

标签: node.js azure azure-blob-storage

我正在尝试获取最新容器上的blob列表的blob名称,并以类似“ _20167”的结尾,所有文件均为XML类型,并具有以下结构:“ {UUID } _ {DocumentType} _ {Status} _ {Source} _ {CompanyNumber} .xml”,例如:“ 1CE6A613-3D64-40E9-B17F-68C063ABC613_2C98EF3B-038B-4AA4-91E1-6FC32E012974_factura_vigente.xml”。

我使用的是 containerURL.listBlobFlatSegment 方法的前缀,但是我找不到改变使用前缀搜索功能的方法。 这是我的功能代码,我只传递要搜索的容器名称和de参数,这称为“ companyNumber”:

async downloadListOfBlobs({ containerName, companyNumber }) {
    try {
      const containerURL = ContainerURL.fromServiceURL(
        this._serviceURL,
        containerName
      );
      let marker;
      marker = undefined;
      let blobsInContainer = [];
      const prefix = `${companyNumber}.xml`;
      do {
        const listBlobsResponse = await containerURL.listBlobFlatSegment(
          Aborter.none,
          marker,
          { include: null,
          maxresults: marker , 
          prefix }
        );

        marker = listBlobsResponse.nextMarker;
        for (const blob of listBlobsResponse.segment.blobItems) {
          console.log(`Blob: ${blob.name}`);
          blobsInContainer.push(`${blob.name}`);
        }
      } while (marker);
      return blobsInContainer[0] ? blobsInContainer[0] : '';
    } catch (error) {
      console.log(error);
      throw error;
    }
  }

有人在寻找另一种方法来动态搜索整个Blob,但我没有得到足够的信息。 因此,非常感谢您的指导!

1 个答案:

答案 0 :(得分:0)

非常感谢您的答复,请考虑一下您的想法,我可以将感兴趣的Blob的完整Blob列表分开,但是,我仍然不能仅针对lisBlobFlatSegment函数直接过滤其结尾等于我公司编号的文档,并且这种情况会危害性能功能。这是完整的新代码:

    try {
      const containerURL = ContainerURL.fromServiceURL(
        this._serviceURL,
        containerName
      );
      let marker;
      marker = undefined;
      let blobsInContainer = [];
      let blobsInContainerNames = [];
      const prefix = `${companyNumber}.xml`;
      do {
          const listBlobsResponse = await containerURL.listBlobFlatSegment(
            Aborter.none,
            marker,
          );
          marker = listBlobsResponse.nextMarker;
          for (const blob of listBlobsResponse.segment.blobItems) {
            if ((prefix && blob.name.endsWith(prefix)) || !prefix) {
              blobsInContainer.push(blob);
            }
          }
        } while (marker);
        blobsInContainer.sort(function(a,b){
          return new Date(b.properties.lastModified) - new Date(a.properties.lastModified);
        })
        for (const blob of blobsInContainer) {
          if ((prefix && blob.name.endsWith(prefix)) || !prefix) {
            blobsInContainerNames.push(blob.name);
          }
        }
        console.log('blobSelected', blobsInContainerNames[0]);
        return blobsInContainerNames[0] ? blobsInContainerNames[0] : '';

      } catch (error) {
        console.log(error);
        throw error;
      }
    }```