在Blob存储绑定的Azure函数中获取文件类型

问题描述

我正在创建一个绑定到我的Azure Blob存储容器的Azure函数,并在文件上传时触发。

此特定容器中可以包含任何类型的文件/ blob,例如图片,PDF,Excel,MP4等。

我想创建不同的处理程序,这些处理程序将根据上传文件类型执行某些操作。例如,如果它是图像文件,我想获取其尺寸。如果是MP4,我想致电其他服务来处理视频等。

如何从Stream获取文件类型?重要的是要注意,我不能依赖文件扩展名,因为在某些情况下,扩展名可能不存在。我有办法获得mimetype吗?

这是标准的BlogTrigger Azure功能代码

[FunctionName("FileManager")]
public static void Run([BlobTrigger("my-container/{name}",Connection = "myConnectionString")]Stream myBlob,string name,ILogger log)
{
    log.Log@R_597_4045@ion($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

解决方法

您可以获取这些属性。

内容类型(如果上载时设置)在metaData参数中返回。

[FunctionName("SomeFunction")]
public async Task RunFunctionFaceDetection(
    [BlobTrigger("%PhotosContainerName%/{blobname}.{blobextension}",Connection = "storage-conn")]Stream inputBlob,string blobName,//blob name
    string blobExtension,//blob extension - file extension
    string blobTrigger,// full path to triggering blob
    Uri uri,// blob primary location
    IDictionary<string,string> metaData) // user-defined blob metadata
{
    _logger.LogInformation($"RunFunctionAWSFaceDetection just started...");
    _logger.LogInformation($@"
            blobName      {blobName}
            blobExtension {blobExtension}
            blobTrigger   {blobTrigger}
            uri           {uri}
            metaData      {metaData.Count}");

    _logger.LogInformation($"C# Blob trigger function processed blob\n Name:{blobName} \n Size: {inputBlob.Length} Bytes");
}
,

否,请使用CloudBlockBlob接收Blob:

using System;
using System.IO;
using System.Text;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;

namespace FunctionApp24
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([BlobTrigger("test/{name}",Connection = "str")] CloudBlockBlob myBlob,string name,ILogger log)
        {
            string a = myBlob.Properties.ContentType;
            log.LogInformation(a);
        }
    }
}

您可以使用以下代码将blob转换为流:

Stream stream = new MemoryStream();
myBlob.DownloadToStreamAsync(stream).Wait();