source

Azure 스토리지에 블럽이 있는지 확인하는 중

manycodes 2023. 2. 7. 00:01
반응형

Azure 스토리지에 블럽이 있는지 확인하는 중

매우 간단한 질문이 있습니다(기대합니다!). 특정 컨테이너에 블럽이 있는지 알고 싶을 뿐입니다.다운로드가 있으면 다운로드하고 없으면 다른 작업을 수행합니다.

인터튜브에서 검색을 해봤는데 DoesExist라는 기능이 있더라고요.그러나 많은 Azure API와 마찬가지로 이것은 더 이상 존재하지 않는 것 같습니다(혹은 있다면 매우 교묘하게 위장된 이름을 가지고 있습니다).

API를 사용하다함수 호출이 존재합니다.하세요.GetBlockBlobReference서버에 대한 콜은 실행되지 않습니다.을 사용하다

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}

주의: 이 답변은 현재 만료되었습니다.존재 여부를 쉽게 확인할 수 있는 방법은 리처드의 답변을 참조하십시오.

아니, 간단한 걸 놓치는 게 아니라...새로운 StorageClient 라이브러리에서 이 방법을 잘 숨겼습니다.:)

당신의 질문에 답하기 위해 블로그 투고를 작성했습니다. http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob.

간단한 답은 CloudBlob을 사용하는 것입니다.FetchAttributes():BLOB에 대해 HEAD 요구를 실행합니다.

블럽이 존재하는지 테스트하기 위해 예외를 잡아야 한다는 것이 재미없어 보입니다.

public static bool Exists(this CloudBlob blob)
{
    try
    {
        blob.FetchAttributes();
        return true;
    }
    catch (StorageClientException e)
    {
        if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
        {
            return false;
        }
        else
        {
            throw;
        }
    }
}

BLOB가 공개되어 있는 경우는, 물론, 그 방법을 알고 있는 언어/환경/플랫폼의 몇 백만개로부터 HTTP HEAD 요구를 송신해, 응답을 체크할 수 있습니다.

코어 Azure API는 RESTful XML 기반의 HTTP 인터페이스입니다.StorageClient 라이브러리는 이 라이브러리의 많은 래퍼 중 하나입니다.다음은 Siram Krishnan이 Python에서 수행한 또 다른 예입니다.

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html

또, HTTP 레벨로 인증하는 방법도 나타냅니다.

저는 스토리지 클라이언트 라이브러리의 렌즈보다 HTTP/REST의 렌즈를 통해 Azure를 보는 것을 더 좋아하기 때문에 C#에서도 비슷한 일을 해 본 적이 있습니다.꽤 오랫동안 나는 ExistsBlob 메서드를 구현하지 않았다.내 블로그는 모두 공개되었고 HTTP HEAD를 하는 것은 하찮은 일이었다.

새로운 Windows Azure Storage Library에는 이미 Exist() 메서드가 포함되어 있습니다.Microsoft에 있습니다.WindowsAzure.Storage.dll.

NuGet 패키지로 제공
작성자: Microsoft
ID: WindowsAzure.보관소
버전: 2.0.5.1

'msdn'도 참조해 주세요.

다른 솔루션이 마음에 들지 않는 경우는, 다음과 같은 다른 솔루션이 있습니다.

Azure 버전12.4.1을 사용하고 있습니다.보관소.Blobs NuGet 패키지.

애저야컨테이너 내의 모든 블럽 목록인 페이지 가능한 개체입니다.다음으로 BlobItem의 이름이 LINQ를 사용하는 컨테이너 내의 각 BLOB의 Name 속성과 동일한지 확인합니다(모든 것이 유효한 경우 물론).

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Linq;
using System.Text.RegularExpressions;

public class AzureBlobStorage
{
    private BlobServiceClient _blobServiceClient;

    public AzureBlobStorage(string connectionString)
    {
        this.ConnectionString = connectionString;
        _blobServiceClient = new BlobServiceClient(this.ConnectionString);
    }

    public bool IsContainerNameValid(string name)
    {
        return Regex.IsMatch(name, "^[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]$", RegexOptions.Singleline | RegexOptions.CultureInvariant);
    }

    public bool ContainerExists(string name)
    {
        return (IsContainerNameValid(name) ? _blobServiceClient.GetBlobContainerClient(name).Exists() : false);
    }

    public Azure.Pageable<BlobItem> GetBlobs(string containerName, string prefix = null)
    {
        try
        {
            return (ContainerExists(containerName) ? 
                _blobServiceClient.GetBlobContainerClient(containerName).GetBlobs(BlobTraits.All, BlobStates.All, prefix, default(System.Threading.CancellationToken)) 
                : null);
        }
        catch
        {
            throw;
        }
    }

    public bool BlobExists(string containerName, string blobName)
    {
        try
        {
            return (from b in GetBlobs(containerName)
                     where b.Name == blobName
                     select b).FirstOrDefault() != null;
        }
        catch
        {
            throw;
        }
    }
}

이것이 미래에 누군가에게 도움이 되기를 바란다.

이게 내가 하는 방식이다.필요한 사람들을 위해 완전한 코드를 보여준다.

        // Parse the connection string and return a reference to the storage account.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("ContainerName");

        // Retrieve reference to a blob named "test.csv"
        CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.csv");

        if (blockBlob.Exists())
        {
          //Do your logic here.
        }

BLOB가 공개되어 있고 메타데이터만 필요한 경우:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "HEAD";
        string code = "";
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            code = response.StatusCode.ToString();
        }
        catch 
        {
        }

        return code; // if "OK" blob exists

예외 메서드를 사용하지 않는 경우 Judell이 제안하는 기본 c# 버전은 다음과 같습니다.그러나 다른 가능한 응답도 다루어야 한다는 점에 유의하십시오.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
    return true;
}
else
{
    return false;
}

업데이트된 SDK를 사용하여 CloudBlobReference를 얻으면 참조로 Exists()를 호출할 수 있습니다.

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx 를 참조해 주세요.

여기에서는 대부분의 답변이 기술적으로는 맞지만 대부분의 코드샘플은 동기/차단 콜을 발신하고 있습니다.오래된 플랫폼이나 코드베이스에 얽매이지 않는 한 HTTP 콜은 항상 비동기적으로 실행되어야 합니다.이 경우 SDK는 이를 완전히 지원합니다.그냥 사용하다ExistsAsync()대신Exists().

bool exists = await client.GetContainerReference(containerName)
    .GetBlockBlobReference(key)
    .ExistsAsync();

Azure Blob 스토리지 라이브러리 v12에서는BlobBaseClient.Exists()/BlobBaseClient.ExistsAsync()

또 다른 유사한 질문에 대한 답변: https://stackoverflow.com/a/63293998/4865541

동일한 Java 버전(새로운 v12 SDK 사용)

공유 키 자격 정보 인증(계정 액세스 키)을 사용합니다.

public void downloadBlobIfExists(String accountName, String accountKey, String containerName, String blobName) {
    // create a storage client using creds
    StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
    String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
    BlobServiceClient storageClient = new BlobServiceClientBuilder().credential(credential).endpoint(endpoint).buildClient();

    BlobContainerClient container = storageClient.getBlobContainerClient(containerName);
    BlobClient blob = container.getBlobClient(blobName);
    if (blob.exists()) {
        // download blob
    } else {
        // do something else
    }
}

언급URL : https://stackoverflow.com/questions/2642919/checking-if-a-blob-exists-in-azure-storage

반응형