关于 GetImage 方法的几点:
- 当您使用 Image.FromStream 时,您不应该关闭(或处置)流
- 如果您在流上调用 Dispose(使用 using 语句),则无需调用 Close
- 您正在写入流,但不是“倒带”,因此据我所知, l_image 实际上没有获取任何数据(除非 Image.FromStream 重置位置本身)。 (可能是 gif/jpg 解码器倒带流,但 bmp/png 不倒带,因此出现错误。)
- 为什么不直接使用采用字节数组的 MemoryStream 构造函数?
简而言之,我相信您的 GetImage 方法可以替换为:
private Image GetImage(string filePath)
{
WebClient l_WebClient = new WebClient();
byte[] l_imageBytes = l_WebClient.DownloadData(filePath);
MemoryStream l_stream = new MemoryStream(l_imageBytes);
return Image.FromStream(l_stream);
}
现在,更重要的是 - 为什么要加载图像?为什么不只将文件本身作为响应,按照您已经在做的那样设置内容类型 - 或者可能只是基于扩展名?换句话说,你的所有代码都将变成:
protected void Page_Load(object sender, EventArgs e)
{
string filePath = Request.QueryString["i"];
string extension = l_filePath.Substring(l_filePath.LastIndexOf('.') + 1);
Response.ContentType = "image/" + extension;
byte[] data = new WebClient.DownloadData(filePath);
Response.OutputStream.Write(data, 0, data.Length);
Response.End();
}
多一点错误处理(包括“这是一个合理的扩展吗?”)会很好,但除此之外我认为还可以。自己实际加载图像的唯一好处是您可以验证它是否真的is图像而不是病毒或类似的东西。
编辑:只是出于兴趣,你有充分的理由吗want图像请求要通过您的服务器吗?为什么网页作者会这样写:
<img src="http://www.mydomain.com/ImageLoader.aspx?i=http://images.mydomain.com/img/a.jpg" />
代替
<img src="http://images.mydomain.com/img/a.jpg" />
There are出于某些原因它可能有用,但在许多情况下它只是一种浪费。