Asp.net MVC- 从请求中获取调整大小的图像 url 获取 404 错误
Asp.net MVC- get resized image from requested url get 404 Error
我在服务器的图像文件夹中有一些图像文件
当 url 请求的图像不存在时,我想获取图像的调整大小版本。
我有代码可以根据原始图像调整图像大小。
但我不知道如何从 url 发送请求时执行此操作,例如
当我键入 http://example.com/Image/a_140_140.jpg
如果有名称为 a.jpg 的文件时,使用我的代码创建一个名称为 a_140_140.jpg
的调整大小的图像,并将其 return 发送给客户端。
但现在我得到 404 Error
请帮助我如何完成这项工作以永远不会出现 404 错误。
我不再在我的应用程序中添加任何路由
能不能试试在IIS中使用404错误转发?
我提供以下解决方案:
我使用 Asp.net MVC
,但通过一些更改,您可以将其用于每个站点
1. 将以下行添加到 web.config
<httpErrors>
<remove statusCode="404" />
<error statusCode="404" path="/Home/Http404/" responseMode="ExecuteURL" />
</httpErrors>
2。将此路线添加到 Routeconfig.cs
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Home", action = "Http404" });
3。对于控制器代码,请使用此代码:
[MySite.WebUI.Infrastructure.AjaxCrawlable]
public ActionResult Index()
{
string url = Request.Url.AbsolutePath;
if (url.LastIndexOf('.') != -1)
{
string extention = url.Substring(url.LastIndexOf('.') + 1).ToLower();
var extentionList = new string[] { "jpg", "png", "gif", "tif" };
if (extentionList.Contains(extention))
{
try
{
string path = System.Web.Hosting.HostingEnvironment.MapPath(Request.Url.AbsolutePath);
string FileName = System.IO.Path.GetFileNameWithoutExtension(path);
string extentionnow = System.IO.Path.GetExtension(path);
var _mainpath = Request.Url.AbsolutePath.Substring(0, Request.Url.AbsolutePath.LastIndexOf("/"));
string _mainfileName = FileName.Substring(0, (FileName.LastIndexOf('_')));
int _imagesize = int.Parse(FileName.Substring((FileName.LastIndexOf('_') + 1)));
if (_imagesize != null || _imagesize != 0)
{
var t = Resize.FindResizeImage("~" + _mainpath + "/" + _mainfileName + extentionnow, _imagesize);
return new RedirectResult(Request.Url.AbsolutePath);
}
}
catch
{
return View();
}
}
}
else
return View();
return View();
}
- 添加此 class 以调整图像大小
使用系统;
使用 System.Collections.Generic;
使用 System.Drawing;
使用 System.Drawing.Drawing2D;
使用 System.IO;
使用 System.Linq;
使用 System.Web;
使用 System.Web.Mvc;
namespace MySite.WebUI.Models
{
public static class Resize
{
public static string FindResizeImage(string path, int size)
{
var _serverpath = HttpContext.Current.Server.MapPath(path);
if (System.IO.File.Exists(_serverpath))
{
var Extention = Path.GetExtension(path);
var _pathresize = path.Substring(0, path.LastIndexOf(".")) + "_" + size.ToString() + Extention;
var _serverpathresize = HttpContext.Current.Server.MapPath(_pathresize);
if (System.IO.File.Exists(_serverpathresize))
{
return _pathresize.Substring(1, _pathresize.Length - 1);
}
else
{
Resize.Resizeing(HttpContext.Current.Server.MapPath(path), HttpContext.Current.Server.MapPath(_pathresize), size);
return _pathresize;
}
}
return null;
}
public static void Resizeing(string imageFile, string outputFile, int size)
{
using (var srcImage = Image.FromFile(imageFile))
{
using (var newImage = new Bitmap(size, size))
using (var graphics = Graphics.FromImage(newImage))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(srcImage, new Rectangle(0, 0, size, size));
newImage.Save(outputFile);
}
}
}
}
}
我在服务器的图像文件夹中有一些图像文件
当 url 请求的图像不存在时,我想获取图像的调整大小版本。
我有代码可以根据原始图像调整图像大小。
但我不知道如何从 url 发送请求时执行此操作,例如
当我键入 http://example.com/Image/a_140_140.jpg
如果有名称为 a.jpg 的文件时,使用我的代码创建一个名称为 a_140_140.jpg
的调整大小的图像,并将其 return 发送给客户端。
但现在我得到 404 Error
请帮助我如何完成这项工作以永远不会出现 404 错误。
我不再在我的应用程序中添加任何路由
能不能试试在IIS中使用404错误转发?
我提供以下解决方案:
我使用 Asp.net MVC
,但通过一些更改,您可以将其用于每个站点
1. 将以下行添加到 web.config
<httpErrors>
<remove statusCode="404" />
<error statusCode="404" path="/Home/Http404/" responseMode="ExecuteURL" />
</httpErrors>
2。将此路线添加到 Routeconfig.cs
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Home", action = "Http404" });
3。对于控制器代码,请使用此代码:
[MySite.WebUI.Infrastructure.AjaxCrawlable]
public ActionResult Index()
{
string url = Request.Url.AbsolutePath;
if (url.LastIndexOf('.') != -1)
{
string extention = url.Substring(url.LastIndexOf('.') + 1).ToLower();
var extentionList = new string[] { "jpg", "png", "gif", "tif" };
if (extentionList.Contains(extention))
{
try
{
string path = System.Web.Hosting.HostingEnvironment.MapPath(Request.Url.AbsolutePath);
string FileName = System.IO.Path.GetFileNameWithoutExtension(path);
string extentionnow = System.IO.Path.GetExtension(path);
var _mainpath = Request.Url.AbsolutePath.Substring(0, Request.Url.AbsolutePath.LastIndexOf("/"));
string _mainfileName = FileName.Substring(0, (FileName.LastIndexOf('_')));
int _imagesize = int.Parse(FileName.Substring((FileName.LastIndexOf('_') + 1)));
if (_imagesize != null || _imagesize != 0)
{
var t = Resize.FindResizeImage("~" + _mainpath + "/" + _mainfileName + extentionnow, _imagesize);
return new RedirectResult(Request.Url.AbsolutePath);
}
}
catch
{
return View();
}
}
}
else
return View();
return View();
}
- 添加此 class 以调整图像大小
使用系统; 使用 System.Collections.Generic; 使用 System.Drawing; 使用 System.Drawing.Drawing2D; 使用 System.IO; 使用 System.Linq; 使用 System.Web; 使用 System.Web.Mvc;
namespace MySite.WebUI.Models
{
public static class Resize
{
public static string FindResizeImage(string path, int size)
{
var _serverpath = HttpContext.Current.Server.MapPath(path);
if (System.IO.File.Exists(_serverpath))
{
var Extention = Path.GetExtension(path);
var _pathresize = path.Substring(0, path.LastIndexOf(".")) + "_" + size.ToString() + Extention;
var _serverpathresize = HttpContext.Current.Server.MapPath(_pathresize);
if (System.IO.File.Exists(_serverpathresize))
{
return _pathresize.Substring(1, _pathresize.Length - 1);
}
else
{
Resize.Resizeing(HttpContext.Current.Server.MapPath(path), HttpContext.Current.Server.MapPath(_pathresize), size);
return _pathresize;
}
}
return null;
}
public static void Resizeing(string imageFile, string outputFile, int size)
{
using (var srcImage = Image.FromFile(imageFile))
{
using (var newImage = new Bitmap(size, size))
using (var graphics = Graphics.FromImage(newImage))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.DrawImage(srcImage, new Rectangle(0, 0, size, size));
newImage.Save(outputFile);
}
}
}
}
}