我有.html文件和gif文件,它们存储在服务器的机器上的一个文件夹中。 Html文件对gif文件有一个引用,如<img src="file.gif" />
。
在我的ASP.NET MVC应用程序中,我想显示“下载”链接。如果用户点击它,浏览器必须显示存储的带有注入图片的html文件。
我尝试使用下一个代码:
@Html.ActionLink("Download", "DownloadHtmlFile", "ControllerName")
public ActionResult DownloadHtmlFile()
{
return new FilePathResult("path_to_html_file.html", "text/html");
}
在这种情况下,浏览器显示html文件。但是在图像的地方有一个洞而不是图像(就像被删除了一样)。
我该如何正确实现?
P.S。我无法将文件存储在我的应用程序的文件夹中(如'C:\ inetpub \ MyApplicationName ...'),以便将它们直接引用到.cshtml中查看,因为它会对它们进行未经授权的访问。
答案 0 :(得分:1)
问题是,html缺少实际图片。
你有2种方法,要么通过完整路径引用图像,即使用户在本地打开.html文件也可以使用它们:
<img src="http://someDomainName.com/file.gif" />
但缺点是如果用户离线,图像将不会显示。
第二个选项是打包(即压缩)文件并将它们一起发送。
像这样:
var outputStream = new MemoryStream();
using (var zip = new ZipFile())
{
zip.AddEntry("path_to_html_file.html", "content1");
zip.AddEntry("path_to_image_file.gif", "content2");
zip.Save(outputStream);
}
outputStream.Position = 0;
return File(outputStream, "application/zip", "filename.zip");
有一点需要注意,如果你想让它变得健壮,你需要存储在DB或xml文件中的元数据(.htmls包含哪些图像)。但这可能会造成维护问题。
另一种选择是使用HtmlAgility包来扫描.htmls图像。
HtmlDocument doc = new HtmlDocument();
doc.Load("path_to_html_file.html");
foreach(HtmlNode link in doc.DocumentNode.SelectNodes("//img[@src]")
{
HtmlAttribute att = link["src"];
//build a collection of image locations and add them to zip
}
答案 1 :(得分:0)
您可以使用以下操作来显示图像而不创建html视图:
public ActionResult Image(string imageName)
{
var imagesPath = Server.MapPath("/Content/Images");
var fullPath = Path.Combine(imagesPath, imageName);
return base.File(fullPath, "image/jpeg");
}
然后你可以用这个网址获取图片:
http://localhost/MyController/Image?imageName=someImage.jpeg
修改强> 如果您需要从视图中显示它,只需添加此方法的操作链接,即
@Url.Action("Image", "MyController", new { imageName = "someImage.jpeg" })
P.S。确保正确设置路由。希望它有所帮助!