Azure Functions, Azure Storage Blob 및 Cosmos DB를 사용하여 공용 URL에서 이미지 복사
제 경우에는 이미지를 저렴하게 호스팅하고 NoSQL 데이터베이스를 통해 이미지의 메타데이터로 작업하고 싶습니다. 이미 사이트를 Azure Static Web App으로 배포하고 있으므로 Azure Storage Blob 및 Azure Cosmos DB는 확실한 선택이었습니다.
이를 달성하기 위해 두 작업을 모두 수행하는 빠른 Azure 함수를 작성했습니다. 이것이 어떻게 작동하는지 살펴보겠습니다.
(완전한 치료를 위해 look at the repository을 복용하십시오.)
시작하기 전에: Azure 리소스 만들기
시작하기 전에 다음을 설정해야 합니다.
이러한 리소스를 모두 생성한 후 구성 값을 내
local.settings.json
파일에 추가했습니다. 이러한 값은 다양한 리소스를 찾아볼 때 포털에서 사용할 수 있습니다. (리소스를 배포할 때 구성에 추가해야 합니다.){
"Values": {
"ApiKey": "my-nasa-api-key",
"CosmosEndpoint": "url-to-my-cosmos-endpoint",
"CosmosKey": "my-cosmos-primary-key",
"CosmosDatabase": "name-of-my-cosmos-db",
"CosmosContainer": "name-of-my-cosmos-container",
"StorageAccount": "storage-account-name",
"StorageKey": "storage-key",
"BlobContainerUrl": "url-to-my-container"
}
}
애저 함수
내 Azure 함수에서는 다음 세 가지 작업을 수행합니다.
Astronomy Picture of the Day site 을 보면 오늘의 이미지와 메타데이터를 호스팅합니다. Storage Blob에 이미지를 넣고 Cosmos DB에 세부 정보를 넣고 싶습니다.
함수 자체는 다음과 같습니다.
//using System;
//using System.Threading.Tasks;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.Azure.WebJobs;
//using Microsoft.Azure.WebJobs.Extensions.Http;
//using Microsoft.AspNetCore.Http;
//using Microsoft.Extensions.Logging;
//using Newtonsoft.Json;
//using System.Net.Http;
//using Azure.Storage;
//using Azure.Storage.Blobs;
//using System.Linq;
//using Microsoft.Azure.Cosmos;
public class ImageUploader
{
private readonly HttpClient httpClient;
private CosmosClient cosmosClient;
public ImageUploader()
{
httpClient = new HttpClient();
cosmosClient = new CosmosClient(Environment.GetEnvironmentVariable("CosmosEndpoint"),
Environment.GetEnvironmentVariable("CosmosKey"));
}
[FunctionName("Uploader")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "upload")] HttpRequest req, ILogger log)
{
var apiKey = Environment.GetEnvironmentVariable("ApiKey");
var response = await httpClient.GetAsync($"https://api.nasa.gov/planetary/apod?api_key={apiKey}");
var result = await response.Content.ReadAsStringAsync();
var imageDetails = JsonConvert.DeserializeObject<Image>(result);
await UploadImageToAzureStorage(imageDetails.Url);
await AddImageToContainer(imageDetails);
return new OkObjectResult("Processing complete.");
}
}
API에서 응답을 받은 후
Image
모델로 역직렬화한 다음 Azure에서 작업을 수행합니다(자세한 내용은 계속 읽으십시오).모델은 다음과 같습니다.
using Newtonsoft.Json;
using System;
namespace MassImageUploader
{
public class Image
{
[JsonProperty("id")]
public Guid Id { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("copyright")]
public string Copyright { get; set; }
[JsonProperty("date")]
public DateTime Date { get; set; }
[JsonProperty("explanation")]
public string Explanation { get; set; }
[JsonProperty("url")]
public string Url { get; set; }
}
}
Azure Storage Blob 컨테이너에 이미지 업로드
내
UploadImageToAzureStorage
방법에서는 공개적으로 액세스할 수 있는 이미지의 URI를 전달합니다. 여기에서 URI의 마지막 부분(예: myfile.jpg)을 추출하여 fileName
를 얻습니다. fileName
를 사용하여 blobUri
에 새 리소스의 경로를 빌드합니다. 이 경로에는 Azure Storage 컨테이너 URL과 fileName
가 포함됩니다.그런 다음 자격 증명을 new
StorageSharedKeyCredential
에 전달하고 new BlobClient
를 인스턴스화합니다. 그런 다음 StartCopyFromUriAsync
에서 복사가 발생하여 URI를 전달합니다.private async Task<bool> UploadImageToAzureStorage(string imageUri)
{
var fileName = GetFileNameFromUrl(imageUri);
var blobUri = new Uri($"{Environment.GetEnvironmentVariable("BlobContainerUrl")}/{fileName}");
var storageCredentials = new StorageSharedKeyCredential(
Environment.GetEnvironmentVariable("StorageAccount"),
Environment.GetEnvironmentVariable("StorageKey"));
var blobClient = new BlobClient(blobUri, storageCredentials);
await blobClient.StartCopyFromUriAsync(new Uri(imageUri));
return await Task.FromResult(true);
}
private string GetFileNameFromUrl(string urlString)
{
var url = new Uri(urlString);
return url.Segments.Last();
}
내 Azure Storage 컨테이너를 탐색하면 내 새 이미지가 표시됩니다.
Cosmos DB에 메타데이터 푸시
내 이미지가 성공적으로 저장되면 메타데이터를 Azure Cosmos DB 컨테이너에 푸시할 수 있습니다. 내 AddImageToContainer
메서드에서는 채워진Image
모델을 전달합니다. 그런 다음 Azure Cosmos DB 컨테이너를 가져오고 경로를 가져온 다음 CreateItemAsync
를 전달하면서 image
를 호출합니다. 쉬운.
private async Task<bool> AddImageToContainer(Image image)
{
var container = cosmosClient.GetContainer(
Environment.GetEnvironmentVariable("CosmosDatabase"),
Environment.GetEnvironmentVariable("CosmosContainer"));
var fileName = GetFileNameFromUrl(image.Url);
image.Id = Guid.NewGuid();
image.Url = $"{Environment.GetEnvironmentVariable("BlobContainerUrl")}/{fileName}";
await container.CreateItemAsync(image);
return await Task.FromResult(true);
}
Azure Portal의 내 Cosmos DB 리소스에 대한 데이터 탐색기에서 새 레코드를 볼 수 있습니다.
마무리
이 게시물에서는 공개적으로 액세스할 수 있는 이미지를 Azure Storage에 저장한 다음 해당 URL 및 기타 메타데이터를 Azure Cosmos DB에 게시하는 방법을 배웠습니다.
언제나처럼 피드백이나 경험을 댓글에 자유롭게 게시하세요.
Reference
이 문제에 관하여(Azure Functions, Azure Storage Blob 및 Cosmos DB를 사용하여 공용 URL에서 이미지 복사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/daveabrock/use-azure-functions-azure-storage-blobs-and-cosmos-db-to-copy-images-from-public-urls-473i
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
private async Task<bool> AddImageToContainer(Image image)
{
var container = cosmosClient.GetContainer(
Environment.GetEnvironmentVariable("CosmosDatabase"),
Environment.GetEnvironmentVariable("CosmosContainer"));
var fileName = GetFileNameFromUrl(image.Url);
image.Id = Guid.NewGuid();
image.Url = $"{Environment.GetEnvironmentVariable("BlobContainerUrl")}/{fileName}";
await container.CreateItemAsync(image);
return await Task.FromResult(true);
}
이 게시물에서는 공개적으로 액세스할 수 있는 이미지를 Azure Storage에 저장한 다음 해당 URL 및 기타 메타데이터를 Azure Cosmos DB에 게시하는 방법을 배웠습니다.
언제나처럼 피드백이나 경험을 댓글에 자유롭게 게시하세요.
Reference
이 문제에 관하여(Azure Functions, Azure Storage Blob 및 Cosmos DB를 사용하여 공용 URL에서 이미지 복사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/daveabrock/use-azure-functions-azure-storage-blobs-and-cosmos-db-to-copy-images-from-public-urls-473i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)