Azure 스토리지 블럽 이름 변경
웹 역할에서 Azure Storage API를 사용하여 Azure Storage Blob의 이름을 변경할 수 있습니까?현재 제가 가진 유일한 해결책은 정확한 이름을 가진 새로운 BLOB에 BLOB를 복사하고 오래된 BLOB를 삭제하는 것입니다.
갱신:
@IsaacAbrahams의 코멘트와 @Viggity의 답변 후에 코드를 업데이트했습니다.이 버전에서는 모든 것을 MemoryStream에 로드할 필요가 없습니다.복사가 완료될 때까지 기다렸다가 소스 BLOB를 삭제합니다.
파티에 늦었지만 Azure Storage API V2를 사용하여 이 게시물에 접속하지 못한 사용자를 위해 다음과 같은 확장 방법을 제공합니다(+ 비동기 버전).
public static class BlobContainerExtensions
{
public static void Rename(this CloudBlobContainer container, string oldName, string newName)
{
//Warning: this Wait() is bad practice and can cause deadlock issues when used from ASP.NET applications
RenameAsync(container, oldName, newName).Wait();
}
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
var source = await container.GetBlobReferenceFromServerAsync(oldName);
var target = container.GetBlockBlobReference(newName);
await target.StartCopyFromBlobAsync(source.Uri);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
}
Azure Storage 7.0 업데이트
public static async Task RenameAsync(this CloudBlobContainer container, string oldName, string newName)
{
CloudBlockBlob source =(CloudBlockBlob)await container.GetBlobReferenceFromServerAsync(oldName);
CloudBlockBlob target = container.GetBlockBlobReference(newName);
await target.StartCopyAsync(source);
while (target.CopyState.Status == CopyStatus.Pending)
await Task.Delay(100);
if (target.CopyState.Status != CopyStatus.Success)
throw new Exception("Rename failed: " + target.CopyState.Status);
await source.DeleteAsync();
}
면책사항:이것은 동기식으로 이름을 변경하는 빠르고 더러운 방법입니다.목적에 적합하지만 다른 사용자가 지적한 것처럼 복사는 시간이 오래 걸릴 수 있으므로 다음과 같은 하나의 방법으로 수행하는 것이 아니라 다음과 같은 방법으로 수행하는 것이 가장 좋습니다.
- 복사 프로세스를 시작합니다.
- 복사 작업 상태 폴링
- 복사가 완료되면 원래 BLOB를 삭제합니다.
Azure Blob Service API는 Blob의 이름 변경이나 이동 기능을 직접 지원하지 않지만, 이를 위한 실용적인 방법이 있습니다.
그러나 복사한 후 삭제할 수 있습니다.
원래 @Zidad의 코드를 사용했는데, 부하가 적은 환경에서는 정상적으로 동작합니다(거의 항상 작은 파일의 이름을 10kb까지 변경합니다).
마세요.StartCopyFromBlobDelete
부하가 높은 시나리오에서는 이름을 바꾼 파일의 20%(수천 개의 파일)가 손실되었습니다.댓글에 써있듯이StartCopyFromBlob복사를 시작합니다.당신은 복사가 끝날 때까지 기다릴 방법이 없어요.
복사가 확실하게 완료되도록 하려면 복사를 다운로드하고 다시 업로드해야 합니다.업데이트된 코드는 다음과 같습니다.
public void Rename(string containerName, string oldFilename, string newFilename)
{
var oldBlob = GetBlobReference(containerName, oldFilename);
var newBlob = GetBlobReference(containerName, newFilename);
using (var stream = new MemoryStream())
{
oldBlob.DownloadToStream(stream);
stream.Seek(0, SeekOrigin.Begin);
newBlob.UploadFromStream(stream);
//copy metadata here if you need it too
oldBlob.Delete();
}
}
이것은 오래된 투고이지만, 이 훌륭한 블로그 투고는 업로드된 블로그의 이름을 빠르게 바꾸는 방법을 다른 사람들에게 보여줄 것이다.
주요 내용은 다음과 같습니다.
//set the azure container
string blobContainer = "myContainer";
//azure connection string
string dataCenterSettingKey = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", "xxxx",
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
//setup the container object
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(dataCenterSettingKey);
CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(blobContainer);
// Set permissions on the container.
BlobContainerPermissions permissions = new BlobContainerPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
container.SetPermissions(permissions);
//grab the blob
CloudBlob existBlob = container.GetBlobReference("myBlobName");
CloudBlob newBlob = container.GetBlobReference("myNewBlobName");
//create a new blob
newBlob.CopyFromBlob(existBlob);
//delete the old
existBlob.Delete();
이름을 변경할 수 없습니다.다음은 용 Azure SDK를 사용한 회피책입니다.NET v12:
BlobClient sourceBlob = container.GetBlobClient(sourceBlobName);
BlobClient destBlob = container.GetBlobClient(destBlobName);
CopyFromUriOperation ops = await destBlob.StartCopyFromUriAsync(sourceBlob.Uri);
long copiedContentLength = 0;
while (ops.HasCompleted == false)
{
copiedContentLength = await ops.WaitForCompletionAsync();
await Task.Delay(100);
}
await sourceBlob.DeleteAsync();
BLOB를 복사한 후 삭제합니다.
1G 사이즈의 파일을 테스트해, 정상적으로 동작.
상세한 것에 대하여는, MSDN 의 예를 참조해 주세요.
StorageCredentials cred = new StorageCredentials("[Your?storage?account?name]", "[Your?storage?account?key]");
CloudBlobContainer container = new CloudBlobContainer(new Uri("http://[Your?storage?account?name].blob.core.windows.net/[Your container name] /"), cred);
string fileName = "OldFileName";
string newFileName = "NewFileName";
await container.CreateIfNotExistsAsync();
CloudBlockBlob blobCopy = container.GetBlockBlobReference(newFileName);
if (!await blobCopy.ExistsAsync())
{
CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
if (await blob.ExistsAsync())
{
// copy
await blobCopy.StartCopyAsync(blob);
// then delete
await blob.DeleteIfExistsAsync();
}
}
ADLS Gen 2(Azure Data Lake Storage Gen 2)의 공개 프리뷰에서 새로운 릴리스를 이용할 수 있게 되었습니다.
계층 이름 공간 기능을 사용하면 이름 변경 작업을 포함하는 디렉토리 및 파일을 원자적으로 조작할 수 있습니다.
단, 다음과 같은 점에 유의하십시오.프리뷰 릴리스에서는 계층형 네임스페이스를 활성화하면 Blob과 Data Lake Storage Gen2 REST API 간의 데이터 또는 운영 상호 운용성이 없어집니다.이 기능은 미리보기 중에 추가됩니다.
ADLS Gen 2를 사용하여 블롭(파일)의 이름을 변경해야 합니다.그렇지 않으면 미리보기 기간 동안 Blob API와 ADLS Gen 2 간의 상호운용성이 추가될 때까지 기다립니다.
몬자 클라우드의 Azure Explorer를 사용하면 18기가바이트 블롭의 이름을 1초 안에 바꿀 수 있습니다.Microsoft의 Azure Storage Explorer는 같은 BLOB를 복제하는 데 29초가 걸리기 때문에 Monza는 복사를 하지 않습니다.Monza 이름 변경 직후에 Microsoft Azure Storage Explorer에서 컨테이너를 클릭하면 새 이름으로 BLOB가 표시되므로 빠른 속도를 알 수 있습니다.
src blob을 새 수신처/이름으로 이동하는 방법밖에 없습니다.이 작업을 수행하기 위한 코드입니다.
public async Task<CloudBlockBlob> RenameAsync(CloudBlockBlob srcBlob, CloudBlobContainer destContainer,string name)
{
CloudBlockBlob destBlob;
if (srcBlob == null && srcBlob.Exists())
{
throw new Exception("Source blob cannot be null and should exist.");
}
if (!destContainer.Exists())
{
throw new Exception("Destination container does not exist.");
}
//Copy source blob to destination container
destBlob = destContainer.GetBlockBlobReference(name);
await destBlob.StartCopyAsync(srcBlob);
//remove source blob after copy is done.
srcBlob.Delete();
return destBlob;
}
다음은 메서드의 일부로 blob lookup을 원하는 경우의 코드 샘플입니다.
public CloudBlockBlob RenameBlob(string oldName, string newName, CloudBlobContainer container)
{
if (!container.Exists())
{
throw new Exception("Destination container does not exist.");
}
//Get blob reference
CloudBlockBlob sourceBlob = container.GetBlockBlobReference(oldName);
if (sourceBlob == null && sourceBlob.Exists())
{
throw new Exception("Source blob cannot be null and should exist.");
}
// Get blob reference to which the new blob must be copied
CloudBlockBlob destBlob = container.GetBlockBlobReference(newName);
destBlob.StartCopyAsync(sourceBlob);
//Delete source blob
sourceBlob.Delete();
return destBlob;
}
BLOB를 복사하여 이름을 바꾸지 않고 스크립트를 실행하지 않고 Azure Blob 스토리지를 OS에 마운트하는 방법도 있습니다.https://learn.microsoft.com/bs-latn-ba/azure/storage/blobs/storage-how-to-mount-container-linux
그냥 then then 럼 then 、 then then 、 then then 、 。mv을 사용법
Azure Storage Explorer를 사용하면 BLOB의 이름을 수동으로 변경할 수 있습니다.https://azure.microsoft.com/en-us/features/storage-explorer/ #http://https://azure.microsoft.com/en-us/features/storage-explorer/ 에서 다운로드 할 수 있습니다.
ContentDisposition 속성을 설정하는 경우
attachment;filename="yourfile.txt"
http를 통한 다운로드 이름은 원하는 대로 사용할 수 있습니다.
스토리지는 데이터가 파일명으로 주로 사용되는 고유 식별자를 사용하여 저장된다는 가정 하에 구축되었다고 생각합니다.그러나 모든 다운로드에 대해 공유 액세스 서명을 발행하는 것은 조금 이상하기 때문에 일부 사용자에게는 적합하지 않습니다.
그러나 사용자용 파일 이름을 추상화하는 것은 전반적으로 좋은 방법이며 전반적으로 보다 안정적인 아키텍처를 장려한다고 생각합니다.
이 기능은 파일 크기가 100MB를 넘지 않는 10만 사용자의 라이브 환경에서 작동했습니다.이것은 @vigity의 답변과 유사한 동기 접근법입니다.다만, Azure측의 모든 것을 카피하고 있기 때문에, 새로운 Blob에 카피/업로드하기 위해서 Memorystream을 서버에 보관 유지할 필요는 없습니다.
var account = new CloudStorageAccount(new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(StorageAccountName, StorageAccountKey), true);
CloudBlobClient blobStorage = account.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("myBlobContainer");
string fileName = "OldFileName";
string newFileName = "NewFileName";
CloudBlockBlob oldBlob = container.GetBlockBlobReference(fileName);
CloudBlockBlob newBlob = container.GetBlockBlobReference(newFileName);
using (var stream = new MemoryStream())
{
newBlob.StartCopyFromBlob(oldBlob);
do { } while (!newBlob.Exists());
oldBlob.Delete();
}
언급URL : https://stackoverflow.com/questions/3734672/azure-storage-blob-rename
'programing' 카테고리의 다른 글
| Azure 데이터베이스의 비밀번호 재설정 (0) | 2023.04.21 |
|---|---|
| 정밀도를 잃지 않고 Python Float를 문자열로 변환 (0) | 2023.04.21 |
| bash curl 문에 '&' 문자를 포함하는 방법 (0) | 2023.04.21 |
| "이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다" 오류가 표시됩니까? (0) | 2023.04.21 |
| Bash 구문 오류: 예기치 않은 파일 끝 (0) | 2023.04.21 |