【问题标题】:Setting the content-type of a blob in Azure functions app blobtrigger在 Azure Functions 应用程序 blobtrigger 中设置 blob 的内容类型
【发布时间】:2017-10-12 06:03:27
【问题描述】:

我正在尝试调整上传到我的容器的图像的大小,以便为我的网站创建缩略图和其他各种版本的图像。

我上传的图片必须更正内容类型“image/jpeg”,但是当我使用下面的代码创建它们的新版本时,结果显示为“application/octet-stream”。

我在这里错过了什么?

using ImageResizer;
using ImageResizer.ExtensionMethods;
 
public static void Run(Stream myBlob, string blobname, string blobextension, Stream outputBlob, TraceWriter log)
{
    log.Info($"C# Blob trigger function Processed blob\n Name:{blobname} \n Size: {myBlob.Length} Bytes");
    
    var instructions = new Instructions
    {
        Width = 570,
        Mode = FitMode.Crop,
        Scale = ScaleMode.Both,
    };
    ImageBuilder.Current.Build(new ImageJob(myBlob, outputBlob, instructions));
}

编辑:解决方案。

#r "Microsoft.WindowsAzure.Storage"
using ImageResizer;
using ImageResizer.ExtensionMethods;
using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(Stream myBlob, string blobname, string blobextension, CloudBlockBlob outputBlob, TraceWriter log)
{
    log.Info($"C# Blob trigger function Processed blob\n Name:{blobname} \n Size: {myBlob.Length} Bytes");
    
    var instructions = new Instructions
    {
        Width = 570,
        Mode = FitMode.Crop,
        Scale = ScaleMode.Both
    };

    Stream stream = new MemoryStream();
    ImageBuilder.Current.Build(new ImageJob(myBlob, stream, instructions));
    stream.Seek(0, SeekOrigin.Begin);
 
    outputBlob.Properties.ContentType = "image/jpeg";
    outputBlob.UploadFromStream(stream);
}

【问题讨论】:

    标签: c# azure azure-blob-storage image-resizing azure-functions


    【解决方案1】:

    当您使用流输出时,函数会将您的内容类型默认为 application/octet-stream。

    使用其中一种 ICloudBlob 类型,它应该允许您指定 blob 的内容类型。

    这是一个可以作为参数绑定到的类型的备忘单:https://jhaleyfiles2016.blob.core.windows.net/public/Azure%20WebJobs%20SDK%20Cheat%20Sheet%202014.pdf

    【讨论】:

    • 嗨,马特,感谢您的回答。我应该改用 cloudblobstream 吗?可以举个例子吗?
    • @Zucchini,您介意分享您的解决方案吗?
    • 没关系,我自己发现的。我将在下面分享我的解决方案,以防其他人在这里结束。
    【解决方案2】:

    这是一个调整图像大小的 Azure 函数的完整工作示例:

    run.csx

    #r "Microsoft.WindowsAzure.Storage"
    
    using Microsoft.WindowsAzure.Storage.Blob;
    using ImageResizer;
    using ImageResizer.ExtensionMethods;
    
    public static void Run(Stream imageStream, string blobName, CloudBlockBlob outputBlob, TraceWriter log)
    {
        log.Info($"Function triggered by blob\n Name:{blobName} \n Size: {imageStream.Length} Bytes");
    
        var instructions = new Instructions
        {
            Width = 400,
            Height = 350,
            Mode = FitMode.Max,
            OutputFormat = OutputFormat.Jpeg,
            JpegQuality = 85
        };
    
        using (var outputStream = new MemoryStream())
        {
            ImageBuilder.Current.Build(new ImageJob(imageStream, outputStream, instructions));
            outputStream.Position = 0;
            outputBlob.Properties.ContentType = "image/jpeg";
            outputBlob.UploadFromStream(outputStream);
        }
    }
    

    function.json

    {
      "bindings": [
        {
          "name": "imageStream",
          "type": "blobTrigger",
          "direction": "in",
          "path": "watched-container/{blobName}.jpg",
          "connection": "AzureWebJobsDashboard"
        },
        {
          "type": "blob",
          "name": "outputBlob",
          "path": "output-container/{blobName}.jpg",
          "connection": "AzureWebJobsDashboard",
          "direction": "inout"
        }
      ],
      "disabled": false
    }
    

    project.json

    {
    "frameworks": {
      "net46":{
        "dependencies": {
          "ImageResizer": "4.0.5"
        }
      }
     }
    }
    

    【讨论】:

    • 效果很好。谢谢!您是否观察到新创建的图像松散的图像方向信息?当在浏览器中打开时,它会使一些垂直图像水平。
    • 不。据我所知,没有发现任何问题(但那是很久以前的事了)。也许它与Instructions 对象有关?
    • 我了解到我们需要添加 AutoRotate=true 以保持方向。
    • 确实如此。好收获!
    猜你喜欢
    • 2017-09-21
    • 2013-03-27
    • 2021-09-17
    • 1970-01-01
    • 2020-11-07
    • 2020-05-02
    • 2016-11-11
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多