Могу ли я скопировать папку BLOB-объектов Azure без обхода каждого файла BLOB-объекта? - PullRequest
0 голосов
/ 04 ноября 2019

В настоящее время я использую golang для реализации копирования файла из одной учетной записи хранения в другую учетную запись хранения.

Например:

https://storage1.blob.core.windows.net/container/A/B/file1.mp4
https://storage1.blob.core.windows.net/container/A/B/file2.mp4
https://storage1.blob.core.windows.net/container/A/B/file3.mp4


Copy from

https://storage1.blob.core.windows.net/container/A/B/
to 
https://storage2.blob.core.windows.net/container/A/B/

Могу ли я скопировать всю папку, не просматривая все файлы в папке A/ B?

Вот мой пример кода



func (css StorageOperator) NestedListBlobs(ctx context.Context, srcFolderPath string) ([]azblob.BlobURL, error) {

    containerName, folderPath := css.getContainerNameAndPath(srcFolderPath)
    containerRawUrl := "https://" + css.StorageName + "." + lib.AzureBlobUrl + "/" + containerName
    containerUrl, _ := url.Parse(containerRawUrl)
    po := azblob.NewPipeline(css.sharedKeyCredential, css.createPipelineOptions())
    container := azblob.NewContainerURL(*containerUrl, po)

    var blobUrls []azblob.BlobURL

    // List the blob(s) in our container; since a container may hold millions of blobs, this is done 1 segment at a time.
    for marker := (azblob.Marker{}); marker.NotDone(); {
        // The parens around Marker{} are required to avoid compiler error.
        // Get a result segment starting with the blob indicated by the current Marker.
        listBlob, err := container.ListBlobsFlatSegment(ctx, marker, azblob.ListBlobsSegmentOptions{
            Prefix: folderPath,
        })
        if err != nil {
            return nil, err
        }
        // IMPORTANT: ListBlobs returns the start of the next segment; you MUST use this to get
        // the next segment (after processing the current result segment).
        marker = listBlob.NextMarker

        // Process the blobs returned in this result segment (if the segment is empty, the loop body won't execute)
        for _, blobInfo := range listBlob.Segment.BlobItems {
            css.logger.Debugf("Blob name: " + containerRawUrl + "/" + blobInfo.Name)

            blobUrl, _ := url.Parse(containerRawUrl + "/" + blobInfo.Name)
            blobUrls = append(blobUrls, azblob.NewBlobURL(*blobUrl, po))
        }
    }

    return blobUrls, nil
}

func (css StorageOperator) parallelCopyFileToDst(ctx context.Context, po pipeline.Pipeline, dstRawUrl string, srcBlobs []azblob.BlobURL) error {


for _, srcBlob := range srcBlobs {


dstUrl, _ := url.Parse(dstRawUrl + css.extractBlobPath(srcBlob))

dstBlobURL := azblob.NewBlobURL(*dstUrl, po)
srcSASUrl, err := css.createSASURL(css.lukeSharedKeyCredential, srcBlob.String())
if err != nil {
    css.logger.Errorf("createSASURL fail:%v", err)
    return
}
startCopy, err := dstBlobURL.StartCopyFromURL(ctx,
                *srcSASUrl,
                azblob.Metadata{},
                azblob.ModifiedAccessConditions{},
                azblob.BlobAccessConditions{})

if err != nil {
    css.logger.Errorf("startCopy fail:%v", err)
    return
}

if err = css.checkCopyStatus(ctx, dstBlobURL, startCopy); err != nil {
                css.logger.Errorf("checkCopyStatus fail:%v", err)
                return
}


}//for
    return nil
}

1 Ответ

1 голос
/ 04 ноября 2019

Структура папок внутри голубых BLOB-объектов не существует, вместо этого она использует имя пути, поэтому, если вы хотите скопировать BLOB-объекты в «виртуальную папку», все, что вам нужно сделать, это использовать путь, ниже приведен пример в Pythonперечисление больших двоичных объектов:

  ['Virtual-Folder/Boards.png', 'storage2.gif']

Таким образом, чтобы передать большой двоичный объект Boards.png, необходимо добавить имя папки перед ним, а не заглядывать в него. Я написал несколько руководств на python, относящихся к этому примеру / проблеме: https://github.com/adamsmith0016/Azure-storage

...