【问题标题】:ASP / SQL: Filepath as clickable linkASP / SQL:文件路径作为可点击链接
【发布时间】:2021-06-03 05:26:56
【问题描述】:

我有一个如下所示的数据库文件:

**Name     Number1      Number2     File**

Henk       123          456         c:\henk.pdf

Piet       345          789         c:\piet.pdf

当我将它放入 SQL 数据源 (Visual Studio) 中时,该文件应该是可点击的文本或图像。 现在它只是纯文本。

<asp:BoundField DataField="Relatienummer" HeaderText="Relatienummer" SortExpression="Relatienummer" />
<asp:BoundField DataField="nummer" HeaderText="nummer" SortExpression="nummer" />
<asp:BoundField DataField="company" HeaderText="company" SortExpression="company" />
<asp:BoundField DataField="Link" HeaderText="Link" SortExpression="Link" />

我目前拥有的是:

<asp:HyperLinkField DataNavigateUrlFields="Link" DataNavigateUrlFormatString="Link" DataTextField="Link" HeaderText="Link" />

但是这个链接是链接而不是sql的内容。

谢谢

【问题讨论】:

    标签: sql asp.net visual-studio


    【解决方案1】:

    请记住,后面的代码可以使用完整的文件系统 - 就像任何桌面代码一样。

    但如果您要在 asp.net(Web 端)中使用该文件,那么您必须能够生成有效的 URL 路径名。

    所以请始终牢记以上几点:

    代码隐藏 - 路径名是标准的 windows 文件路径名(甚至是“\”等)。

    网页 - 标记 = 网站映射的有效 URL。

    如果你把上面的两个概念混淆了?忽略上述非常简单的想法,您将陷入痛苦的世界。

    因此,您需要两件事将这些路径名转换为有效的 WEB 链接:

    首先:网络服务器“站点”需要权限和“手段”来指向相关的给定文件夹。

    因此,您可能有一些 SAN 或大型网络存储设备 - 您将文件扔/放置/拥有/放置在那里。

    这样说:

    \\BIGSERVER1\PdfFolder\Customers
    

    现在在你的代码后面?你可以使用

    \\BIGSERVER1\PdfFolder\Customers\Policy.pdf
    

    但是对于网络服务器呢?好吧,您不可能也不会允许 VALID WEB URL 使用您网络上的任何旧服务器路径名称(同样,代码背后的概念与 VALID Web 链接的概念在任何时候都在您的脑海中) .

    好的,那么我们将如何在asp.net + web端使用上述文件路径? (现在我们不是在谈论背后的代码 - 对吧?)。

    好吧,在 99% 的情况下,您会启动 IIS 管理,并添加所谓的虚拟文件夹。因此,这会从网站映射到上述文件夹。

    看起来像这样:

    所以在上面,文件夹 UpLoadFiles 可以这样映射:

    \\BIGSERVER1\PdfFolder\Customers
    

    所以,代码隐藏(你的 vb/c# 代码将使用这个:

    \\BIGSERVER1\PdfFolder\Customers\myfile.pdf
    

    但是,一个网络链接将是这个

    http://myCoolWebSite/UpLoadFiles/myfile.pdf
    

    因此,任何超链接等都必须是如上所述的有效 URL。而且由于我们只将一个文件夹映射到网站,因此用户不能只输入任何旧电子邮件并抓取/获取/弄乱该服务器上的文件,或者您的整个网络。但请记住,您的代码背后没有这样的限制 - 只需使用平面简有效的完整服务器或简单的完整有效 Windows 路径名规划简代码。

    因此,在您的数据表中,假设保存的文件是

     myfile.pdf
    

    所以,我建议您从文件中分离出有效的 Windows 路径名。

    好的,所以要提供一个有效的网络链接,你需要这个表达式:

     "~/UpLoadFiles/" + "myfile.pdf"
    

    因此,这可以是数据绑定表达式,甚至可以是驱动网格/列表或显示的任何对象的 SQL 查询的一部分。

    最后但并非最不重要的一点:

    通常在您的代码中,您需要(想要/必须)将给定的有效 URL 转换为正确的旧平面简文件路径名(毕竟后面的任何代码都只能与那些平面简完整有效的 Windows 路径名一起使用。

    所以,您的代码可以这样做:

    dim strFileName   as string
    ' assume say you have the database and a row in a "data row"
    
    strFileName = Server.MapPath("~/UpLoadFiles/" & MyDataRow("FileName"))
    
    So above code will of course translate the virtual folder that points
    to the server holding the files and return a full valid windows path name
    for your code. (the same as the full server pathname I exampled above).
    

    另一种方法?

    好吧,不要设置虚拟文件夹,也不要让有效的 URL 路径直接指向这些文件。如果您处理客户 A 文件和客户 B 文件,然后允许这些文件的有效 URL(他们可以输入),那么您只需要允许并使用后面的代码来获取这些文件。

    所以,现在您的超链接变成了一个按钮。当他们单击该按钮时,后面的代码会读取文件并将文件流(泵出)到 Web 浏览器。因此,当您执行此操作时,他们将获得标准文件下载,但从不存在任何实际有效的 URL 供他们输入(因此文件是安全的 - 从那时起,您和您的代码将完全控制谁可以获得什么文件,因为没有存在映射到该文件夹​​问题的有效 URL。因此,只有后面的代码才能继续使用和享受平面简有效的 Windows 文件名,但事物的 Web 端将没有也不允许映射虚拟文件夹的有效 URL,因为您没有创建一个。

    当然,如果您在网站中创建一个“文件夹”作为子文件夹,那么在大多数情况下可以输入有效的 URL。但是如果您使用根网站和文件夹之外的服务器或文件夹,那么您必须使用该虚拟文件夹映射来创建并生成指向该网站的值 URL 映射。

    那么,如果你想要一个超链接?然后想要一个链接按钮或类似的东西。

     iFile='<%# "~/UpLoadFiles/" + Eval("InternalFileName")%>'> 
    

    或者说这个超级链接:

     src ='<%# "~/UpLoadFiles/" + Eval("InternalFileName")%>'> 
    

    因此,您必须设置一个虚拟文件夹以将 windows 陆地平面 jane 文件夹映射到有效的基于 Web 的 URL 的文件夹。

    所以你甚至可以把它放在 SQL 查询中

    SELECT ID, [Name], Number1, Number2, File, '~/UpLoadFiles/' + File as FileUrl
    FROM tblFiles
    

    因此,您现在拥有该超链接或链接按钮的有效 URL。

    您没有分享您如何为 Web 服务器设置文件映射,但您要非常清楚,背后的代码仍将始终使用完整的标准路径名。但网站 URL 不是 - 它们基于您网站的路径名。如前所述,您可以将文件放在您拥有的网站根目录的子文件夹中,然后您就不需要虚拟文件夹。但是对于站点外部的文件,或出于安全原因,您通常会将这些文件的文件和文件夹不在基本网站文件夹中。但是添加一个虚拟(映射)文件夹在很大程度上意味着您可以在运行 Web 服务器的同一网络上指向/公开任何有效的文件夹系统。

    我怀疑您是否允许 URL 驱动 c:\myfile.pdf。

    【讨论】:

    • 非常感谢您的详细回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多