У меня было немного свободного времени, и, несмотря на то, что я использовал функции Azure более года, у меня никогда не было возможности реализовать BlobTrigger
. Поэтому я решил поделиться своей крошечной реализацией теста ядра 3.0 и добавить ответ с избыточным количеством слов в качестве дополнения к правильному ответу @Bryan Lewis.
Если вы хотите проверить это перед запуском Azure, вы Сначала убедитесь, что у вас есть Azure Storage Emulator. Если у вас есть Visual Studio 2019, он должен быть уже установлен. Если у вас VS19, но он не установлен, вы должны открыть установщик Visual Studio и изменить установку VS19. В разделе «Отдельные компоненты» вы должны найти «Azure Storage Emulator». Если у вас нет VS19, вы можете получить его здесь .
Далее я бы порекомендовал загрузить Azure Storage Explorer из здесь . Если эмулятор работает, и вы не изменили порты по умолчанию для эмулятора хранилища, вы сможете найти запись по умолчанию в разделе Локальные и подключенные> Учетные записи хранения> (Эмулятор - Порты по умолчанию).
Использование В Storage Explorer вы можете развернуть «Blob Containers». Щелкните правой кнопкой мыши «Контейнеры BLOB-объектов», выберите «Создать контейнер BLOB-объектов» и дайте ему имя. Для моего примера я назвал это «youtube-files». Я также создал другой контейнер, назвав его «youtube-files-description».
![Create container](https://i.stack.imgur.com/frwMo.png)
Теперь для самой функции. Я позволил себе сделать это с помощью инъекций зависимостей (я просто боюсь хаоса). Для этого вам нужно будет включить пакет NuGet Microsoft. Azure .Functions.Extensions и Microsoft.Extensions.DependencyInjection.
Запуск
Мы регистрируем наши услуги и что- не здесь. Я добавлю InternalYoutubeService (названный так, чтобы не путать его с тем, который предоставляется API-интерфейсами Goodle). Вы можете узнать больше о DI и Azure функциях здесь .
// Notice that the assembly definition comes before the namespace
[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]
namespace FunctionApp1
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
// You can of course change service lifetime as needed
builder.Services.AddTransient<IInternalYoutubeService, InternalYoutubeService>();
}
}
}
BlobFunction
Вам не нужно добавлять / регистрировать классы, содержащие какие-либо azure функций, они обрабатываются автоматически. Обратите внимание на разницу между BlobTrigger
и Blob
. BlobTrigger
диктует, что только когда файлы загружаются в контейнер youtube-files, функция на самом деле запускается; одновременно он будет искать большой двоичный объект в контейнере «youtube-files-description» для файла с тем же именем файла, что и входящее из BlobTrigger
, но с суффиксом «-description» и только если он использует ». TXT "расширение. Если BLOB-объект не найден, он вернет значение NULL, а связанная строка description
будет иметь значение NULL. Вы можете найти различные привязки здесь . В общем, ссылка расскажет вам, что вам нужно знать об атрибутах BlobTrigger
и Blob
.
[StorageAccount("AzureWebJobsStorage")]
public class BlobFunction
{
private readonly IInternalYoutubeService _YoutubeService;
private readonly ILogger _Logger;
// We inject the YoutubeService
public BlobFunction(IInternalYoutubeService youtubeService, ILogger<BlobFunction> logger)
{
_YoutubeService = youtubeService;
_Logger = logger;
}
[FunctionName("Function1")]
public async void Run(
[BlobTrigger("youtube-files/{filename}.{extension}")] Stream blob,
[Blob("youtube-files-descriptions/{filename}-description.txt")] string description,
string filename,
string extension)
{
switch (extension)
{
case "mp4":
await _YoutubeService.UploadVideo(blob, filename, description, "Some tag", "Another tag", "An awesome tag");
break;
case "mp3":
await _YoutubeService.UploadAudio(blob, filename, description);
break;
default:
_Logger.LogInformation($"{filename}.{extension} not handled");
break;
}
}
}
YoutubeService
Будет содержать лог c, который Вы будете обрабатывать фактическую аутентификацию (используемый вами OAuth2) и загрузку файла. Вы можете обратиться к ответу @Bryan Lewis с точки зрения того, как использовать входящий Stream
. Мы могли бы сохранить наши учетные данные в конфигурации нашего функционального приложения и внедрить интерфейс IConfiguration, который позволяет нам получать доступ к значениям, предоставляя ключ значения, определенный в конфигурации. Таким образом вы избегаете жесткого кодирования любых учетных данных в вашем коде. Я пропустил спецификацию YouTube c upload logi c, поскольку у меня нет опыта работы с библиотекой, которую вы используете, но она должна быть достаточно простой для переноса logi c в службу.
public interface IInternalYoutubeService
{
Task UploadVideo(Stream stream, string title, string description, params string[] tags);
Task UploadAudio(Stream stream, string title, string description, params string[] tags);
}
internal class InternalYoutubeService : IInternalYoutubeService
{
private readonly IConfiguration _Configuration;
private readonly ILogger _Logger;
public InternalYoutubeService(IConfiguration configuration, ILogger<InternalYoutubeService> logger)
{
_Configuration = configuration;
_Logger = logger;
}
public async Task UploadAudio(Stream stream, string title, string description, params string[] tags)
{
_Logger.LogInformation($"{_Configuration["YoutubeAccountName"]}");
_Logger.LogInformation($"{_Configuration["YoutubeAccountPass"]}");
_Logger.LogInformation($"Bytes: {stream.Length} - {title} - {description} - {string.Join(", ", tags)}");
}
public async Task UploadVideo(Stream stream, string title, string description, params string[] tags)
{
_Logger.LogInformation($"{_Configuration["YoutubeAccountName"]}");
_Logger.LogInformation($"{_Configuration["YoutubeAccountPass"]}");
_Logger.LogInformation($"Bytes: {stream.Length} - {title} - {description} - {string.Join(", ", tags)}");
}
}
local.settings. json
Вы, конечно, поместите эти значения в конфигурацию своего функционального приложения на портале Azure, за исключением строки хранения, когда закончите. локальное тестирование.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"YoutubeAccountName": "MyAccountName",
"YoutubeAccountPass": "MySecretPassword"
}
}
тестирование
Я тестирую с помощью простого текстового файла «Test File-description.txt», содержащего текст «Это пример описания ".. У меня также есть файл MP3 ~ 5MB, "Test File.mp3". Я начинаю с перетаскивания моего текстового файла в контейнер «описания файлов youtube», а затем с перетаскиванием «Тестовый файл». mp3 "файл в контейнер" youtube-files ". Функция не запускается при загрузке текстового файла; только после загрузки" Test File.mp3 "функция запускается. Я вижу следующие записанные строки:
Executing 'Function1' (Reason='New blob detected: youtube-files/Test File.mp3', Id=50a50657-a9bb-41a5-a7d5-2adb84477f69)
MyAccountName
MySecretPassword
Bytes: 5065849 - Test File - This is a sample description. -
Executed 'Function1' (Succeeded, Id=50a50657-a9bb-41a5-a7d5-2adb84477f69)