如何渲染不存储在Web应用程序主文件夹中的图像文件?

时间:2011-03-14 10:31:55

标签: asp.net asp.net-mvc routing

想象一下,有一个web(mvc)应用程序,服务器上的主目录是默认的c:\intepub\wwwroot。我需要的是:

  1. 用户请求http://server/randomPicture
  2. 服务器响应,其中包含一个简单页面,其中包含来自预定义路径的随机图片, iis文件夹/ app,如d:\lolcats\
  3. 当然,这个样本非常简单。我的解决方案是:当请求/randomPicture/时,将随机图片复制到APP_Images/current_response.jpg或其他任何应用程序主文件夹,然后简单地渲染

    <img src="../APP_Images/current_response.jpg" />
    

    这是唯一的解决方案,还是有更文明的方法呢?

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,但最简单的是最不讨人喜欢的方法:只需为IIS中的图像位置创建一个虚拟文件夹。

答案 1 :(得分:1)

您可以按如下方式使用HTTP处理程序:

    public class GetImage : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        DateTime now = DateTime.Now;
        context.Response.Cache.SetExpires(now.AddYears(1));
        context.Response.Cache.SetCacheability(HttpCacheability.Public);
        context.Response.Cache.SetValidUntilExpires(true);
        context.Response.Cache.SetLastModified(now);
        context.Response.Cache.VaryByParams["FileID"] = true;
        context.Response.Cache.SetOmitVaryStar(true);

        context.Response.ContentType = file.ContentType;
        context.Response.AppendHeader("content-length", file.ContentLength.ToString());

        //TODO: Get your file here
        string contentDisposition = String.Empty;
        contentDisposition += "filename=" + file.OriginalFilename;

        context.Response.AppendHeader("content-disposition", contentDisposition);
        string imagePath = Path.Combine(HostingEnvironment.MapPath(Settings.Default.MediaPath), file.LocalFilename);
        context.Response.WriteFile(imagePath);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

并像这样使用它:

<img src="/Handlers/GetImage.ashx?FileID=' + thumbnailFileID + '" alt="" />