本文介绍了使用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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!