本文介绍了使用ImageResizer没有正确设置Content-Type的天青C#WebJob的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个蓝色的WebJob向调整新上传的图片。调整大小的作品,但新创建的图像没有自己内容的Blob存储类型设置正确。相反,他们列出的应用程序/八位字节流。在这里,code处理调整大小:

 公共静态无效ResizeImagesTask(
    [BlobTrigger(输入/ {名} {} EXT)]流inputBlob,
    字符串名称,
    串分机,
    的IBinder粘合剂)
{
    INT [] =尺寸800 {500,250};
    变种inputBytes = inputBlob.CopyToBytes();
    的foreach(尺寸为VAR宽)
    {
        VAR输入=新的MemoryStream(inputBytes);
        无功输出= binder.Bind<流>(新BlobAttribute($输出/ {name}的-w {宽度} {}分机,FileAccess.Write));        ResizeImage(输入,输出,宽);
    }
}私有静态无效ResizeImage(流输入,流输出,诠释宽度)
{
    VAR说明=新指令
    {
        宽度=宽度,
        模式= FitMode.Carve,
        规模= ScaleMode.Both
    };
    ImageBuilder.Current.Build(新ImageJob(输入,输出,指令));
}

我的问题是在哪里,我会如何设置内容类型?有什么事情我必须做手工,或者是有在我如何使用该库$ P $从作为原始(库认为它应该表现出的行为)分配相同的内容类型pventing它的错误?

谢谢!

最后更新

感谢托马斯,他在最后的解决方案帮助下到达,在这里它是!

 公共类功能
{
    //输出blolb大小
    私人静态只读INT [] =尺寸800 {500,250};    公共静态无效ResizeImagesTask(
        [QueueTrigger(assetimage)] AssetImage资产,
        字符串的容器,
        字符串名称,
        串分机,
        [斑点({集装箱} / {name}的_master。{} EXT,FileAccess.Read)流blobStream,
        [斑点({}容器)] CloudBlobContainer cloudContainer)
    {        //获取MIME类型来设置内容类型
        VAR mime类型= MimeMapping.GetMimeMapping(${}名称{_master EXT});        的foreach(在尺寸VAR宽)
        {
            //设置输入流的开始位置。
            blobStream.Seek(0,SeekOrigin.Begin);            //获取输出流
            VAR的OutputStream =新的MemoryStream();
            ResizeImage(blobStream,OutputStream的,宽度);            //获取BLOB参考
            VAR BLOB = cloudContainer.GetBlockBlobReference($(名称)_ {宽度} {}分机。);            //设置输出流的开始的位置。
            outputStream.Seek(0,SeekOrigin.Begin);
            blob.UploadFromStream(OutputStream的);            //更新内容类型= GT;如果需要的话不知道
            blob.Properties.ContentType = mime类型;
            blob.SetProperties();
        }
    }    私有静态无效ResizeImage(流输入,流输出,诠释宽度)
    {
        VAR说明=新指令
        {
            宽度=宽度,
            模式= FitMode.Carve,
            规模= ScaleMode.Both
        };
        变种imageJob =新ImageJob(输入,输出,指令);        //不要处理源对象
        imageJob.DisposeSourceObject = FALSE;
        imageJob.Build();
    }    公共静态无效PoisonErrorHandler([QueueTrigger(webjobs-blogtrigger毒药)] BlobTriggerPosionMessage消息,TextWriter的日志)
    {
        log.Write(这斑点无法由原始功能处理:+ message.BlobName);
    }
}公共类AssetImage
{
    公共字符串集装箱{搞定;组; }    公共字符串名称{;组; }    公共字符串内线{搞定;组; }
}公共类BlobTriggerPosionMessage
{
    公共字符串FunctionId {搞定;组; }
    公共字符串BlobType {搞定;组; }
    公共字符串容器名称{搞定;组; }
    公共字符串BlobName {搞定;组; }
    公共字符串的ETag {搞定;组; }
}


解决方案

您不能从您的实现将内容类型设置:

您需要访问 CloudBlockBlob.Properties.ContentType 属性:

  CloudBlockBlob一滴=新CloudBlockBlob(...);
blob.Properties.ContentType =图像/ ...;
blob.SetProperties();

天青Webjob SDK支持的Blob绑定,这样就可以直接绑定到一个blob。

在你的情况下,你要绑定到一个输入BLOB和创建多个输出斑点。


  • 使用 BlobTriggerAttribute 的输入。

  • 使用 BlobTriggerAttribute 绑定到你的输出斑点。因为你要创建多个输出斑点,可以直接绑定到输出容器。

您的触发功能的code可以看起来像:

 使用System.IO;
使用的System.Web;
使用ImageResizer;
使用Microsoft.Azure.WebJobs;
使用Microsoft.WindowsAzure.Storage.Blob;公共类功能
{
    //输出blolb大小
    私人静态只读INT [] =尺寸800 {500,250};    公共静态无效ResizeImage(
        [BlobTrigger(输入/ {名} {} EXT)]流blobStream,字符串名称,字符串转
        [斑点(输出)] CloudBlobContainer容器)
    {
        //获取MIME类型来设置内容类型
        VAR mime类型= MimeMapping.GetMimeMapping(${名称} {}分机。);
        的foreach(在尺寸VAR宽)
        {
            //设置输入流的开始位置。
            blobStream.Seek(0,SeekOrigin.Begin);            //获取输出流
            VAR的OutputStream =新的MemoryStream();
            ResizeImage(blobStream,OutputStream的,宽度);            //获取BLOB参考
            VAR BLOB = container.GetBlockBlobReference(${}名称{-w宽度} {}分机。);            //设置输出流的开始的位置。
            outputStream.Seek(0,SeekOrigin.Begin);
            blob.UploadFromStream(OutputStream的);            //更新内容类型
            blob.Properties.ContentType = mime类型;
            blob.SetProperties();
        }
    }    私有静态无效ResizeImage(流输入,流输出,诠释宽度)
    {
        VAR说明=新指令
        {
            宽度=宽度,
            模式= FitMode.Carve,
            规模= ScaleMode.Both
        };
        变种imageJob =新ImageJob(输入,输出,指令);        //不要处理源对象
        imageJob.DisposeSourceObject = FALSE;
        imageJob.Build();
    }
}

请注意在 ImageJob 对象上使用的 DisposeSourceObject 这样我们就可以读取多个时间一滴流。

此外,你应该有一个看Webjob文档中关于 BlobTrigger :如何使用Azure的Blob存储与WebJobs SDK

So it could be better to trigger message from a queue that just send the filename, you can bind automatically the input blob to the message queue :

using System.IO;
using System.Web;
using ImageResizer;
using Microsoft.Azure.WebJobs;
using Microsoft.WindowsAzure.Storage.Blob;

public class Functions
{
    // output blolb sizes
    private static readonly int[] Sizes = { 800, 500, 250 };

    public static void ResizeImagesTask1(
        [QueueTrigger("newfileuploaded")] string filename,
        [Blob("input/{queueTrigger}", FileAccess.Read)] Stream blobStream,
        [Blob("output")] CloudBlobContainer container)
    {
        // Extract the filename  and the file extension
        var name = Path.GetFileNameWithoutExtension(filename);
        var ext = Path.GetExtension(filename);

        // Get the mime type to set the content type
        var mimeType = MimeMapping.GetMimeMapping(filename);

        foreach (var width in Sizes)
        {
            // Set the position of the input stream to the beginning.
            blobStream.Seek(0, SeekOrigin.Begin);

            // Get the output stream
            var outputStream = new MemoryStream();
            ResizeImage(blobStream, outputStream, width);

            // Get the blob reference
            var blob = container.GetBlockBlobReference($"{name}-w{width}.{ext}");

            // Set the position of the output stream to the beginning.
            outputStream.Seek(0, SeekOrigin.Begin);
            blob.UploadFromStream(outputStream);

            // Update the content type =>  don't know if required
            blob.Properties.ContentType = mimeType;
            blob.SetProperties();
        }
    }

    private static void ResizeImage(Stream input, Stream output, int width)
    {
        var instructions = new Instructions
        {
            Width = width,
            Mode = FitMode.Carve,
            Scale = ScaleMode.Both
        };
        var imageJob = new ImageJob(input, output, instructions);

        // Do not dispose the source object
        imageJob.DisposeSourceObject = false;
        imageJob.Build();
    }
}

这篇关于使用ImageResizer没有正确设置Content-Type的天青C#WebJob的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 01:49