将图像写入具有不同名称的页面

时间:2011-08-31 11:12:13

标签: c# asp.net-mvc asp.net-mvc-2

我正在尝试实现一个简单的验证码系统,我希望在不使用其原始名称的情况下输出图像。

例如,我想将图像文件8.gif输出到名为captcha1.gif的页面

我已经阅读了各种帖子,但我正在寻找最简单的解决方案。

这是我到目前为止所拥有的......

<% Html.RenderAction("OuputCaptchaImage", "Home", new { imageName = "1" }); %>

public ActionResult OuputCaptchaImage(string imageName)
{
    var dir = Server.MapPath("images/");
    var path = Path.Combine(dir, imageName + ".gif"); // Like to change name here
    return base.File(path, "image/gif");
}

以及我想要呈现给页面的内容

<img src="image/captcha1.gif" />

1 个答案:

答案 0 :(得分:1)

以下标记将正确输出图像。但是,您仍然遇到在网址中引用文件名的问题。

<img src="<%= Url.Action("OuputCaptchaImage", "Home", new { imageName = "1" })%>" />

哪个会输出以下HTML:

<img src="/Home/OuputCaptchaImage?imageName=1" />  

您可以指定其他值作为参数(如枚举而不是图像名称),然后修改逻辑以返回正确的文件。

但是(AFAIK)输出一个不存在文件名的图像需要Httphandler拦截请求并将所需的图像写出到响应流中。


修改

以下是使用HttpHandler拦截“captcha1.gif”的传入请求并将不同图像传输到响应的示例:

<强>标记式

<img src="Images/captcha1.gif" />

<强> HttpHandler的

public class OuputCaptchaImageHandler : IHttpHandler
{
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    public void ProcessRequest(HttpContext context)
    {
        string imagePath =
                context.Server.MapPath(@"~\Images\1.gif");
        Bitmap bitmap = new Bitmap(imagePath);

        context.Response.ContentType = "image/gif";
        bitmap.Save(context.Response.OutputStream, ImageFormat.Gif);

        bitmap.Dispose();              
    }
}

<强>的Web.Config

  <httpHandlers>
    <add verb="*" path="Images/captcha1.gif" type="FullyQualifiedNameSpace.OuputCaptchaImageHandler, RootNamespace" validate="false"></add>     
  </httpHandlers>

<强>的Global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("Images/captcha1.gif/{*pathInfo}");

    ....

希望这有帮助。