我正在尝试实现一个简单的验证码系统,我希望在不使用其原始名称的情况下输出图像。
例如,我想将图像文件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" />
答案 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}");
....
希望这有帮助。