我在网络服务器上有像{sku_number} .jpg这样的图像。现在我希望为每个访问者提供此图像的文件名,如{sku_number} foo.jpg,而无需重命名Web服务器上的文件。
这可能吗?如何?
答案 0 :(得分:1)
我建议将欺骗图像中的302返回到原始图像,它将允许您的Web服务器仍然正确地缓存资产,而无需在每次请求资产时对文件系统进行非常低效的读/写操作在.NET级别,同时仍然使用欺骗路径屏蔽DOM中的路径(尽管如果这是一个问题,原始路径将是可见的)。
验证302是否可以满足您的特定需求。
否则,您将基本上模拟用于资产缓存的IIS管道,这可能很粗糙。
答案 1 :(得分:0)
如果我理解正确,那么其中一个选项将是HTTP Handler
public class ImageHttpHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
protected RequestContext RequestContext { get; set; }
public void ProcessRequest(HttpContext context)
{
AdvertType type;
var url = context.Request.Url.ToString();
//TODO: get ID and extension from url 123456789_TitleOfTheProduct.jpg
var path = "yourpathtoimgfolder/id.extension"
//Get binary data
context.Response.ContentType = "image/png";
context.Response.BinaryWrite(bytes);
}
}
然后在system.webServer中的web.config中注册 - >处理
<add name="YourName" verb="*" path="virtual/folder/*" type="Namespace.ImageHttpHandler, Your.Assembly.With.Handler, Version=1.0.0.0, Culture=neutral" preCondition="managedHandler" />
答案 2 :(得分:0)
Url.Content帮助程序方法获取文件的虚拟内容路径,并返回一个网址以访问您网站中的文件。您不应该将物理目录位置传递给它。
您可以考虑在网络应用中保存图片。创建一个名为“Images”的目录,然后您可以安全地使用Url.Content方法。
例如,
@foreach (var imgPath in Directory.GetFiles(Server.MapPath(Url.Content("~/Images/"))))
{
<img src="@Url.Content("~/Images/"+ @Path.GetFileName(imgPath))" />
}
或者如果您绝对需要将图像存储在应用程序根目录之外的某个位置(例如:“C:\ temp \ images或网络位置”),您可以考虑创建一个采用文件名的操作方法,读取文件从位置返回并作为图像返回。
public ActionResult GetImg(string id)
{
var path = $@"C:\temp\images\{id}.png";
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "image/png");
}
现在您只需要调用此终点并将其用作图像src属性。
@foreach (var imgPath in Directory.GetFiles(@"C:\temp\images", "*.*"))
{
<img src="@Url.Action("GetImg",new {id=Path.GetFileNameWithoutExtension(imgPath)})" />
}
以上是一个简单的解决方案,我将其硬编码为返回png文件。你可以更新它以更灵活(添加一个参数来接受文件扩展名)
注意:我个人更喜欢在剃刀文件中保留最小的C#。我喜欢将C#代码(所有那些Directory.GetFiles行)移动到GET操作,并通过视图模型/视图包(根据需要)将图像名称列表传递给视图。
答案 3 :(得分:0)
您可以创建一个简单的控制器来处理此类请求。
[RoutePrefix("products/images")]
public class ProductImagesController : Controller {
[HttpGet]
[Route("{sku_number:long}_{title}.{extension}", Name = "ProductSkuImage")]//Matches GET products/images/123456789_TitleOfTheProduct.jpg
public ActionResult Get(long sku_number, string title, string extension) {
var fileStorePath = Server.MapPath("~/images");
var fileName = string.Format("{0}.{1}", sku_number, extension);
var path = Path.Combine(fileStorePath, fileName);
if (System.IO.File.Exists(path)) {
var mimeType = MimeMapping.GetMimeMapping(fileName);
var downloadName = string.Format("{0}_{1}.{2}",sku_number,title,extension);
return File(path, mimeType, downloadName);
}
return HttpNotFound();
}
}
只是作为一个简单的自我解释的例子,上面的内容可以重构,以提供更大的灵活性。例如,sku不是从磁盘加载文件,而是用于从数据库或Web服务等其他数据存储中获取文件。
从View
调用的示例<a href="@Url.RoutUrl("ProductSkuImage", new { sku_number=123456789 , title = "TitleOfTheProduct" , extension="jpg" })" >TitleOfTheProduct</a>
会生成
<a href="http://localhost/products/images/123456789_TitleOfTheProduct.jpg">TitleOfTheProduct</a>