gpt4 book ai didi

c# - 为了使 Request.InputStream 保持事件状态,不处理 BinaryReader 对象?

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:48 25 4
gpt4 key购买 nike

我有几个方法可以使用 Request.InputStream 处理图像的保存。我有两个共享 HttpContext 的扩展。在我的一种方法中,我使用 BinaryReader 读取内容并进行处理。但是,当然,在处理 BinaryReader 时,它会关闭 Request 上的 InputStream 属性。我的第二种方法使用相同的输入流来创建缩略图。

基本上,在第一种方法中处理读取器后,我需要一种方法来使 Request.InputStream 属性保持事件状态。这可能吗?这是我的两种方法。首先调用 SaveImageStream(),然后调用 GenerateThumbnail()。

public static void SaveImageStream(this HttpContextBase ctx, string filename)
{
var config = ObjectFactory.GetInstance<IConfig>();

using (var reader = new BinaryReader(ctx.Request.InputStream))
{
var bandImagesPath = config.GetSetting<string>("BandImagePath");
var path = Path.Combine(ctx.Server.MapPath(bandImagesPath), filename);

byte[] file = reader.ReadBytes((int)ctx.Request.InputStream.Length);

using (var outputStream = System.IO.File.Create(path, 2048))
{
const int chunkSize = 2 * 1024; // 2KB
byte[] buffer = new byte[chunkSize];
int bytesRead;
ctx.Request.InputStream.Position = 0;
while ((bytesRead = ctx.Request.InputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, bytesRead);
}
}
}
}

public static void GenerateThumbnail(this HttpContextBase ctx, string filename)
{
var config = ObjectFactory.GetInstance<IConfig>();

int size = config.GetSetting<int>("ThumbSize");
var thumbPath = Path.Combine(ctx.Server.MapPath(config.GetSetting<string>("ThumbPath")), filename);

var image = System.Drawing.Image.FromStream(ctx.Request.InputStream);
var thumb = image.GetThumbnailImage(size, size, null, IntPtr.Zero);

thumb.Save(thumbPath, System.Drawing.Imaging.ImageFormat.Png);
}

最佳答案

您可以使用“装饰器”模式来包装 InputStream。看看这篇文章的结尾的例子:

http://ydie22.blogspot.com/2008/02/about-idisposable-close-streams-and.html

关于c# - 为了使 Request.InputStream 保持事件状态,不处理 BinaryReader 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4863542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com