【问题标题】:How to open a local file from a web client/server如何从 Web 客户端/服务器打开本地文件
【发布时间】:2021-01-21 07:50:00
【问题描述】:

我正在尝试在一个项目中添加一个链接,该链接将打开一个解释如何使用该系统的教程。 该教程只与在公司工作的人相关,所以我认为最好将教程放在我们公司的网络驱动器上,并且只从 Web 客户端重定向到该文件。这样,在不重新上传系统的情况下更改教程也很容易。

问题似乎是 chrome 阻止我从 Web 客户端打开本地文件。

但如果我没记错的话,有些网站可以打开本地 pdf 文件。那为什么我无法打开教程?它基本上是一个演示文稿(我认为在 Flash 中,并不重要),您可以通过打开一个 html 文件来打开它。

是否有任何替代解决方案? 如果 chrome 会询问用户是否确定要打开文件或类似的东西,我也可以。 但我不想将文件直接添加到我的项目代码中,因为它需要重新上传整个项目才能仅更新教程。

我在后端使用 ASP.NET Framework,在前端使用 Angular。

【问题讨论】:

  • 您知道闪存支持已经结束,对吧? support.google.com/chrome/answer/6258784?hl=da
  • 所以也许它不是flash...这对我来说并不重要,我只知道您通过单击html文件打开它,如果我将文件位置复制并粘贴到搜索栏它知道打开它并显示需要显示的浏览器。
  • <a href="file://MachineName/ShareName/FileName.pdf">click!</a> ?
  • 我尝试执行此操作,但在控制台中收到错误消息:不允许打开本地文件。正如我所说,chrome 阻止了我这样做。
  • 我想您可以在后端项目中添加一个文件夹,该文件夹将被视为静态内容的来源,因此其内容将像从网络服务器一样托管。然后,您可以像链接任何在线资源一样进行链接。

标签: c# asp.net angular typescript google-chrome


【解决方案1】:

没有脑子的人会使用可以打开本地文件的浏览器。你的意思是你来我的网站看猫视频,而浏览器一直在打开你的银行文件或窃取标有“我的密码?”的 Excel 表。差远了!浏览器无法打开本地文件期间!!!有很高的安全风险。

您当然可以将文件夹暴露给网络服务器,然后该文件夹中的任何文件都成为网站的一部分,更重要的是成为网络服务器“URL”映射的一部分。

因此,您可以拥有您的典型站点(例如 inetpup\wwwroot。在该文件夹中,然后只允许指向该网站文件夹中文件的有效 URL。

假设您的网络上有一些大型文件服务器,里面装满了文件?那么,您可以在站点中添加所谓的虚拟文件夹。

所以,假设网站在 c:\inetpub\wwwroot

因此,用户输入的任何有效 URL(或您启动网页的代码)现在都是

http://mysite/default.aspx

上面的文件当然映射到 c:\inetpub\wwwroot\Default.aspx.

那么,假设您在网络上有一个文件夹,里面装满了您希望用户查看/查看/使用的 pdf 文件?

好吧,假设该文件夹是: \SERVER5\PpdFileArcive。

因此,该文件夹不是网站的一部分。您所做的是向 asp.net 站点添加一个虚拟文件夹。让我们称之为 MyPdfs

您将 MyPdfs 映射到上面的 \SERVER5\PdfFileArchive

所以,现在您的网址变成了这样: http://mysite/MyPdf/help.pdf

因此,浏览器无法查看您计算机上的本地文件(您是否真的认为我的网站可以在您的本地计算机上翻阅?不是!!!!)。

因此,您可以在本地网络上放置一些文件夹。如果网站在同一个网络上,那么您可以向该网站添加一个虚拟文件夹。然后,该“外部”文件夹将成为网站的一部分并映射到一个网络“URL”,然后允许您说具有超链接,甚至允许用户输入任何 url,例如:

http://mysite/MyPdf/HowToCookPotatos.pdf

事实上,在许多情况下,您不希望用户输入 URL,而且通常您不希望用户能够输入 url。

请记住,背后的代码(在 Web 服务器上运行的 .net 代码)实际上与 .net 桌面代码相同。后面的代码可以在网络上的任何地方打开/读取/使用任何文件——包括桌面上的文件。但这会假设 Web 服务器与您位于同一网络上,并且假设即使在任何计算机上运行的桌面程序也有权访问您的桌面文件夹。 (这不是默认设置 - 我认为大多数桌面都有一个共享的公用文件夹)。

因此,该网络服务器上的代码可以打开、读取/处理任何文件。但是你不能说使用超链接,或者说一个有效的 URL 来获取这些文件。

因为公司经常不想将那个巨大的 pdf 文件夹暴露在疯狂而疯狂的互联网上?那么常见的做法是您不创建虚拟文件夹,也不将 URL 映射到该内部公司文件夹。您有 OPEN + READ 后面的代码,然后将文件流式传输到浏览器。您可以通过 Google 搜索并找到 100 个示例 - 只需通过 Google 将 pdf 流式传输到浏览器即可了解其工作原理。但同样,请记住,这个技巧/建议仍然仅限于在服务器上运行的代码,能够直接访问和打开位于文件夹中的文件。只要网络服务器有权读取/打开/使用此类文件,该文件就可以位于网络上的任何位置。该网站的用户将没有任何可能的 URL 输入,但如果背后的代码具有此类权限或打开此类文件的能力,则可以编写 Web 代码以“输出”或所谓的“流”该文件到浏览器。

因此请记住 Web URL(有效的 Web 路径名称)的概念,以及不使用 URL 来打开和读取文件的代码背后的概念 - 但您使用平面简常规 Windows 文件路径名称。

当然,如果您有一个虚拟文件夹和一个向最终用户公开的 URL,那么 STILL 背后的代码通常需要处理/打开/复制或对用户输入的 URL 执行任何操作。这就是 server.mapPath 的用武之地。它会将 URL 值转换为完整的内部路径名。

所以 Code behind = ALWAYS 需要一个完整有效的 Windows 路径名。 URL -web 文件夹(包括指向服务器文件夹的虚拟文件夹)。这些 URL 可用于超链接、Web 导航,甚至允许用户输入该文件夹中给定 pdf 的完整 URL(但用户将输入解析为该文件夹的有效 URL)。

因此,虽然您不能出于所有实际目的让浏览器在您的计算机上读取/获取/使用本地文件?您可以在某些服务器(甚至网络服务器)上设置一个文件夹,其中包含所有这些 pdf、图片或任何您想要的内容。有了映射的虚拟文件夹,Web 用户就可以使用这些文件。

或者,如果您想保持锁定状态,不希望用户输入可能不属于他们的文件的 URL?然后,您当然可以维护一个文件列表,例如在数据库或其他文件中。后面的代码可以使用完整有效的内部路径名直接 100% 读取此类文件,然后将该文件推送(流式传输)给用户。

以下是此类代码的示例: Stream PDF to browser?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多