【问题标题】:Setting Absolute ImageUrl设置绝对 ImageUrl
【发布时间】:2010-02-09 05:50:00
【问题描述】:

我的 .aspx 页面上有一个 Image 控件,我想将 ImageUrl 设置为如下所示:

<asp:Image ID="imgLogo" ImageUrl="C:\ExternalImages\logo.jpg" runat="server" />

但这不起作用。我在 MSDN 上阅读了有关 ImageUrl 属性的信息,它说 url 可以是绝对路径或相对路径。但是我怎样才能设置完整的路径,如上图所示?

【问题讨论】:

    标签: asp.net image


    【解决方案1】:

    “绝对” 表示从客户的角度来看是绝对的,如http://foo.com/images/logo.jpg/images/logo.jpg。区别在于完全限定域名或前导“/”,它告诉浏览器从根或域级别加载该路径。

    “相对” 表示没有前导斜杠,并告诉浏览器以当前文件夹为起点导航到路径。所以../images/logo.jpg是一个相对路径,意思是“相对于当前文件夹,上移一个文件夹,然后下移到images文件夹,然后是logo.jpg”

    您展示的示例指示最终用户的浏览器从他们自己的机器上加载该路径,在大多数情况下这将不起作用,因为他们没有该路径或文件:)

    【讨论】:

      【解决方案2】:

      绝对 URL 是指 URL 的整个 IIS 路径(不是您的磁盘目录路径)。 (即http://yourVirtualDirectory/ExternalImages/logo.jpg)。

      在您的 IIS 主机上创建一个指向 C:\ExternalImages 的虚拟目录。在您的控件中使用该虚拟目录路径。

      【讨论】:

        【解决方案3】:

        ImageUrl 不是计算机的路径,而是一个 Url 路径:http://www.something.com/logo.jpg" or "/logo.jpg"

        【讨论】:

          【解决方案4】:

          您也可以从磁盘中获取映像,但您必须添加:file:// 但不会在您正在开发的任何其他机器上运行-

          【讨论】:

            【解决方案5】:

            绝对和相对 URL 指的是服务器上的关系。

            例如:http://mydomain.se/mysite/images/image.gif 是绝对路径 /images/image.gif 是相对路径。 相对方式,您的页面位于服务器上的 Mysite 目录中。

            使用相对路径的原因是它更容易移动网站, 使用绝对路径的原因是您可以将“myimage.html”移动到子目录而不会破坏 url。

            【讨论】:

              【解决方案6】:

              Absolute 表示项目中的绝对值,relative 表示相对于当前位置,例如../../Images/logo.jpg。您最好使用 absolute 以获得最大的灵活性,例如~Images\logo.jpg。波浪号 ~ 在运行时自动替换为正确的相对路径。

              【讨论】:

                【解决方案7】:

                该文件夹必须在您的虚拟文件夹中,因此您可以这样做:

                <asp:image imageurl = "/ExternalImages/logo.jpg" runat="server">
                

                另一种选择是创建一个可以读取该文件的页面,因此您可以编写:

                <asp:image imageurl = "MyImage.aspx?name=logo.jpg" runat="server">
                

                您的 MyImage.aspx.cs 将如下所示:

                protected void Page_Load(object sender, EventArgs e)
                {
                    string basePath = @"c:\ExternalFolder";
                    string combined = Path.Combine(basePath, Request.QueryString["name"]);
                    if(!basePath.Equals(Path.GetPathRoot(combined), 
                        StringComparison.InvariantCultureIgnoreCase))
                        throw new System.Security.SecurityException();
                
                    using (FileStream image = new FileStream(combined, FileMode.Open))
                    {
                        int length = (int)image.Length;
                        byte[] buffer = new byte[length];
                        image.Read(buffer, 0, length);
                
                        Response.BinaryWrite(buffer);
                    }
                }
                

                但请注意,代码可能会导致注入问题,因为您可以将“..\”传递给 name 参数并访问该文件夹外的文件。

                所以,将该文件夹放在您的虚拟目录中。

                编辑明确说明:我的建议是将您的ExternalFolder 放在您的虚拟目录中。这会让你的生活更轻松。

                有时无法移动文件夹。所以我也更新了上面的代码来处理非规范的文件名。

                【讨论】:

                • 我宁愿避免这种技术,并将所有将被直接访问的内容放在 IIS 公用文件夹中。正如您提到的,这会导致注入问题,这意味着根本不要使用。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-18
                • 1970-01-01
                • 2016-04-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多