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
다른 솔루션이 마음에 들지 않는 경우는, 다음과 같은 다른 솔루션이 있습니다.
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
'source' 카테고리의 다른 글
JavaScript에서 객체에 지정된 속성이 있는지 확인하는 방법 (0) | 2023.02.07 |
---|---|
Java 8: Java.util.function의 TriFunction(및 kin)은 어디에 있습니까?아니면 대체방법이 뭐죠? (0) | 2023.02.07 |
sql mariadb, 파티션 위의 오류 구문 (0) | 2023.02.07 |
Azure 도입에 시간이 걸리는 이유는 무엇입니까? (0) | 2023.02.07 |
목록에 세트 추가 (0) | 2023.02.07 |