图像未显示从系统硬盘读取。
在我的应用程序中,我想在名为attachments的文件夹中读取存储的图像。要运行该应用程序,用户必须在其c盘中创建一个名为attachments的文件夹。 存储的文件的路径如下。 C:\附件\ test.jpg放在。 我想动态读取存储在此文件夹中的图像。我能够从数据库中获取文件的名称。图像不会显示在图像控件中。
我尝试了以下方法:
ImageID. ImageURL= “C:\Attachments\test.jpg”
var url = Server.MapPath("~/Attachments / test.jpg");
ImageID.ImageUrl = url;
ImageID.ImageUrl = VirtualPathUtility.ToAbsolute("~/Attachments ") + "/test.jpg"
当图像存储在系统磁盘中且文件夹不在Web应用程序路径中时,在图像控件中显示图像的确切方法是什么。
答案 0 :(得分:5)
要运行该应用程序,用户必须在其c盘中创建一个名为附件的文件夹。
此声明有些含糊不清,但希望这意味着安装应用程序的用户必须在与Web应用程序相同的计算机上创建C:\ Attachments文件夹 。如果是这种情况,那么最简单的解决方案是打开IIS管理器,右键单击您的应用程序文件夹并使用以下设置添加虚拟目录:
虚拟目录如下所示:
然后,在.aspx页面中,只需将ImageURL
控件的Image
属性设置为与应用相关的网址:
this.ImageID.ImageUrl = "~/Attachments/test.jpg";
(您不需要自己解析URL。Image
控件会将〜解析为相对于当前请求的相应URL,IIS会将浏览器发送的绝对URL映射到C :\ Attachments文件夹。)
但是,如果您想说您网站的每个访问者必须在自己的计算机上创建一个C:\ Attachments文件夹 ,那么您应该重新开始 - 评估您要执行的操作:浏览器安全设置不允许网页访问本地存储在客户端计算机上的资源。
答案 1 :(得分:3)
您需要清楚“网络路径”,“系统硬盘”或“他的C盘”。
就Web开发而言,连接到客户端计算机的磁盘是客户端,连接到Web服务器的磁盘是服务器。
如果以上所有内容都与客户端相关,那么只有一种情况可能 - 客户端和服务器都在同一台机器上,并且Web应用程序在IE中被添加为可信站点。在这种情况下,您可以将C:\ Attachments \ test.jpg视为页面的一部分。其他浏览器可能不支持此功能。在所有其他情况下,这是不可能的,也许没有意义。
如果您想在服务器上执行该操作,并且您需要在Web应用程序之外安装该文件夹,那么您可以使用ashx处理程序,您需要从图像中调用
ImageID.ImageURL = “handler.ashx?图像= test.jpg放在”
从那里你可以阅读并输出图像。示例:How to bind a folder of my hard disk on my webpage with datalist?
答案 2 :(得分:2)
尝试修改第二个示例:
<asp:Image ID="Image2" runat="server" />
Image2.ImageUrl = "~\images\test.png"
对我而言,它运作正常。还要小心路径中的空白!
修改强>
好的,你想在客户端使用文件夹中的图像。你不能这样做。您的代码隐藏在服务器上运行,而不是在客户端上运行。您可以让用户在服务器上上传文件以使用它。这将以这种方式工作:
<asp:FileUpload ID="FileUploadControl" runat="server" />
<asp:Button runat="server" ID="UploadButton" Text="Upload" OnClick="UploadButton_Click" />
Dim filename As String = Path.GetFileName(FileUploadControl.FileName)
FileUploadControl.SaveAs(Server.MapPath("~/") & filename)
然后使用上面的代码显示图像。 如果您按照上述方式访问客户端,则您访问的任何网页都可以访问您的所有文件。 Web协议不允许您本地窃取客户端计算机的文件。
您必须执行以下操作之一:
答案 3 :(得分:2)
为这些图片提供HttpHandler
- 这样您就可以从Web应用程序可以访问的任何文件夹中提供图像(包括某些库中的数据库或嵌入资源)。
假设通用处理程序将命名为ImageHandler.ashx:
public class ImageHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
const string folder = @"c:\Attachments";
string fileName = context.Request.QueryString["FileName"];
var path = Path.Combine(folder, fileName);
var mapping = new Dictionary<string, string> {
{ ".gif", "image/gif" },
{ ".jpg", "image/jpeg" },
{ ".jpeg", "image/jpeg" },
{ ".png", "image/png" },
{ ".bmp", "image/bmp" }
};
var info = new DirectoryInfo(Path.GetDirectoryName(path));
if (!info.FullName.StartsWith(folder, StringComparison.OrdinalIgnoreCase)) {
// someone is using .. to hack our path - send him away
context.Response.StatusCode = 404;
context.Response.End();
return;
}
if (!File.Exists(path)) {
// file not found - 404
context.Response.StatusCode = 404;
context.Response.End();
return;
}
// set some client caching - you can skip this if you don't want to
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddDays(3));
var extension = Path.GetExtension(path).ToLowerInvariant();
string contentType;
if (!mapping.TryGetValue(extension, out contentType)) {
contentType = "application/octet-stream";
}
context.Response.ContentType = contentType;
context.Response.WriteFile(path);
}
public bool IsReusable {
get { return false; }
}
}
现在您可以申请
等图片了<asp:Image ID="Image2" runat="server"
ImageUrl="~/ImageHandlers.ashx?FileName=test.png" />
如果你想在服务器端缓存图像(如果你使用的是IIS7),你可以在web配置中设置条目,如:
<location path="ImageHandler.ashx">
<system.webServer>
<caching>
<profiles>
<add extension=".ashx" policy="CacheForTimePeriod" duration="00:00:10" varyByQueryString="FileName" />
</profiles>
</caching>
</system.webServer>
</location>
答案 4 :(得分:1)
您必须在Web应用程序中创建一个文件夹。
浏览器无法从硬盘上的任意位置访问文件。它只能访问Web服务器提供的文件。这意味着文件必须在您的Web应用程序中。