图像 src 指向 WEB FORM 中我的项目文件夹外的文件

Image src pointing on a file outside my project folder in WEB FORM

我正打算这样做 :

set src property in view to a url outside of the MVC3 project

很好,但是是网络形式?

我尝试简单地将路径作为字符串放入图像的 src 中:

<asp:Image  ID="imgInside" runat="server" src="\serverName.com\dfs$\APPL-ADM\FichiersDev\MandatsInfo\SAR220-2020_1.jpg" >

显然不工作,所以我在这个函数上做了 src pointe,我这样写的:

<asp:Image runat="server" Width="160px"  src='<%# getImage(Container.DataItem as MandatMobile.DAL.MandatsEcoleCC_Result) %>' ></asp:Image>

在后端 C# 中:

protected Byte[] getImage(MandatsEcoleCC_Result p)
{
    using (MandatsDatas db = new MandatsDatas())
    {
        GROUPE_ARTICLE g = db.GROUPE_ARTICLE.First(t => t.ID_GROUPE == p.ID_GROUPE);

        if (string.IsNullOrWhiteSpace(g.image))
            return null;

        FileStream fs = null;
        try
        {
            fs = new FileStream(@"\serverName.com\dfs$\APPL-ADM\FichiersDev\MandatsInfo\" + g.MANDAT.NO_MANDAT + g.image, FileMode.Open, FileAccess.Read);
        }
        catch
        {
        }

        BinaryReader br = new BinaryReader(fs);
        return br.ReadBytes((int)fs.Length);
    }
}

仍然没有用,我一直在搜索,但我就是想不通,我一直在尝试各种无意义的方法。

我最终在另一个 MVC 项目中放置了一个可以正常检索图像的函数。

所以我的 src 路径指向 URL 而不是服务器路径上的文件。

src='https://NameOf_MVC_webSite.csdn.qc.ca/imageBank/ForMandat?name=' + (Container.DataItem as MandatMobile.DAL.MandatsEcoleCC_Result).image

使用另一个具有(更好/易于使用/功能)框架的已部署应用程序的肮脏解决方案

但这不是一个“OK”的解决方案

好吧,你混淆了两件事:

后面的代码: 任何时候你 运行 使用文件的代码,然后你编写 100% 服务器端代码。因此,任何文件路径都是正确的 windows 完整限定路径名。它与网络URL's.

零零相关

以上阅读十几遍。您的代码不使用 URL 路径名 - 故事结束。

网站: 任何时候您引用文件、图片、脚本文件或任何东西?您是并且必须使用基于网站路径名的 URL,更多的是解析为代表该网站的文件夹的路径名。 根: \Pictures(比如网站文件夹列表中带有图片的文件夹。

那么,网站中的 src 或任何 URL?他们不使用 windows 路径名,如隐藏代码。 那么,如果文件夹图片中有一张cat.png图片呢?当你的 URL 将是这样的:

www.mywebsite.com/Pictures/cat.png

如果你给read/load/see/use那个cat.png图片写代码?然后,您将代码从该扩展 URL 转换为完全限定的标准 windows 路径名(带有后缀)。 那么,如果您想阅读上述文件或对上述文件执行某些操作,可以在代码后面吗? 你用

dim strFile  as string
strFile = Server.MapPath("www.mywebsite.com/Pictures/cat.png")

地图路径现在 return 一个完全限定的 windows 服务器路径 例如:

c:\inetpub\wwwrootmysite\Pictures\cat.png

好的,现在我们意识到要对网站上的图片使用有效的 link,我们必须使用有效的 URL。

那么,如果假设我们有一个网络连接到巨大的 SAN 驱动器或网络上具有巨大存储空间的其他大型服务器,并且在该站点中有我们的照片,会发生什么情况?

说:

\SANSERVER\WebPictures\cat.png

嗯,很明显文件夹不能在 URL 中使用。只能使用 Web 文件夹路径名中的 URL。这是一件好事。因为当我去 www.amazon.com 时,我不能输入 URL 来访问他们的内部会计文件服务器并窃取所有客户的所有信用卡信息,这是一件非常好的事情。

那么,现在,我怎样才能得到那个 cat.png,并将它变成一个有效的 URL?

有两种方法: 一: 您决定公开并包含上述路径名作为网站的一部分。这通常是通过所谓的虚拟文件夹完成的。您需要 IIS,并且在使用 IIS + Visual Studio 进行开发期间,设置此类路径名是一件“痛苦”的事情。但是如果你有完整版的 IIS,那么你可以通过 IIS 用户界面工具将 virutal 文件夹添加到网站。

因此,您添加一个名为 MyPictures 的虚拟文件夹,它将映射到:

\SANSERVER\WebPictures\cat.png

所以,现在网站 URL 变成:

www.mycoolsite.com/MyPictures/cat.png

并且在代码中,如果你做一个 server.map 路径,上面的 url 将 return 这个: \SANSERVER\WebPictures\cat.png

好的,下一期: 我不想将其他文件夹公开给网站。我不想要一个有效的 URL,我什至不希望用户能够输入这样的内容:

www.mycoolsite.com/MyPictures/doggie.png

因此,如果您公开另一个文件夹或将文件夹添加到网站层次结构,那么用户可以自由输入 URL 来解析到另一个文件夹(但假设您已经向网站添加了一个虚拟文件夹)。

现在,有了有效的 URL 分辨率,您就可以在网站上放置标记代码,并为图片或网站提供有效的完整 URL 路径名。

但是,出于安全原因,我不希望其他服务器暴露为 URL?

好吧,它没有公开为有效的 Web URL 文件夹,那么您不能放入有效的 URL - 很简单。

但是,这并不意味着后面的代码不能 read/load/open 服务器上的那个文件。事实上,后面的网站代码通常可以读取服务器上的任何文件,实际上可以读取网络服务器 运行ning 网络上任何地方的任何文件。如前所述,后面的代码不使用 URL s,并且不使用“转发”“/”作为文件 - 但计划 jane old fashting 完全限定 windows 路径名。

既然后面的代码可以读取任何文件并做任何它想做的事? 好的,那我们如何才能得到隐藏的代码来分发文件,或者将该文件发送到网站?

两个简单的方法: 您后面的代码可以读取 cat.png 文件,并将其复制到作为 Web 服务器文件夹布局一部分的文件夹中。一旦一个,您就可以提供一个有效的 URL。然而,有一个巨大的图片库,那将是痛苦的。

并且在某些情况下,图片可能来自存储图片的数据库行,并且再次不存在网站的有效路径名。

因此,您可以做的是在代码后面读取文件,然后将数据直接“流”到网站。

当你从后面的代码中提取内容时,你不关心甚至不需要有效的 URL,因为后面的代码正在抽出对象数据(在这种情况下是一张图片 cat.png) 直接到网络浏览器。所以这通常是因为如果您的图片甚至不存在于文件中,或者实际上出于安全原因将该文件夹包含在网站文件夹列表中是不切实际的。

如前所述,如果这个 was/is 只是网站文件夹之外的一个图片文件夹?那么99%的时候,然后在网站上添加一个指向图片硬盘的映射文件夹(虚拟文件夹)是很常见的,而且很实用。

然而,您可能在大文件服务器上有一个巨大的图片库,并且您有一个数据库,其中包含用于搜索图片的关键字,并且数据库行存储了一个有效的硬盘路径名drive/server 在 Hodge podge 文件夹层次结构中包含所有图片,将其公开为基于 Web urls 是不切实际的。

那么,如何流式传输文件?

您的代码很接近,但您需要包含其他信息。不幸的是,服务器无法将文件流式传输为 100% 二进制格式。

所以,假设我们将一个图像控件拖放到窗体上。你有这个:

        <asp:Image ID="Image1" runat="server" />

那么,现在在code behind to stream + set the picture to a picture on the hard drive?

你可以使用这个:

    Dim strFile As String = "c:\Test4\pcards.bmp"
    Me.Image1.ImageUrl = Gimage2(strFile)

现在当然 URL 上述 Test4 文件夹的路径名不存在了。

Gimage2 - 它只是将文件转换为字节数组,然后转换为编码为 base64 的字符串。

Function Gimage2(strPath As String) As String

    Dim PicData As Byte() = Nothing
    PicData = File.ReadAllBytes(strPath)
    Dim ContentType As String = "image/" & Path.GetExtension(strPath)

    Return "data:" & ContentType & ";base64," & Convert.ToBase64String(PicData, 0, PicData.Length)

End Function

所以我花了一些时间长post。原因是您尝试使用带有标准 windows 反斜杠的 URL,这意味着在您看来,您使用的是 windows 完整路径名的概念,并且 MAJOR 将其与URL 路径名。未能做出这种区分会给你带来多年的痛苦和磨难。您必须让 BEYOND CRYSTAL 清除 URL 的概念和代码隐藏文件名的概念。它们是两种截然不同的东西。

如果该附加文件夹“可以”公开给网站?然后创建一个虚拟文件夹。

这意味着:

wwww.mycoolsite.com/MyPictures/dog.png

实际上可以指向您服务器上的任何映射文件夹。这意味着 Web 服务器将需要对该文件夹的权限,因此在大多数情况下,用户(或您的代码)可以输入并使用图片的完整 Web 路径名。

但是,如前所述,对于 pdf 文档和许多其他类型的文件,拥有有效的 URL 和映射的文件夹是不可能的。因此,您可以使用上述 100% 基于文件的方法,以字节形式读取文件,然后将文件流式传输并输出到浏览器。

您甚至可以执行 response.write 并将文件直接输出到浏览器,但您又无法控制文件的位置。请注意,按照上述方式将字符串作为 base 64 数据抽出会导致发送的要呈现为图片的字符串的大小出现一些膨胀和扩展。所以对于一个简单的图像——当然没问题。但是对于更大的高质量高分辨率图像,那么我当然不建议您将图片作为 base64 字符串发送,因为该字符串会导致扩展。