【问题标题】:Why can't I do <img src="C:/localfile.jpg">?为什么我不能做 <img src="C:/localfile.jpg">?
【发布时间】:2025-12-06 09:45:01
【问题描述】:

如果 html 文件是本地的(在我的 C 驱动器上),它可以工作,但如果 html 文件在服务器上并且图像文件是本地的,则不能。这是为什么呢?

任何可能的解决方法?

【问题讨论】:

  • 请问你为什么要做这样的事情?
  • @BorisCallens 例如,当我在自己的机器上有新图像并且我不想经历整个过程时,我可能想在我的登台网站上测试图像的更改上传到登台。似乎唯一的方法是在开发环境中更改图像而不是暂存。
  • 这也是与技术能力较差的熟人开玩笑的好方法,让他们认为您入侵了网站。
  • 另一种快速执行此操作的方法是将文件上传到 Google Drive 或其他任何内容,然后复制图像 url 并将其粘贴到 src=""
  • 只需在您的机器上使用开发网络服务器。现在这很容易,因为即使是 PHP 也内置了一个。

标签: html src


【解决方案1】:

如果客户端可以请求本地文件系统文件,然后使用 JavaScript 找出其中的内容,这将是一个安全漏洞。

解决此问题的唯一方法是在浏览器中构建扩展。 Firefox 扩展和 IE 扩展可以访问本地资源。 Chrome 的限制要严格得多。

【讨论】:

  • 不过,flash 仍然可以访问用户选择的任何内容,即使在 Chrome 中也是如此
  • 对此表示赞成,因为它回答了原因并提供了一些解决方法。我可能会做的(而且我知道我没有提供太多背景知识)是创建一个本地网络服务器来提供本地图像。这样浏览器就可以显示它们。
  • Flash 只能访问具有适当策略文件的本地资源,否则它会进入本地模式并以其他方式受到限制。
  • 这种偏执的安全只是一种干扰。您可以使用 AJAX 从带有 字段的表单将用户文件上传到服务器,但是如果您想对用户友好并显示预览,则必须进行往返并将文件上传到服务器第一。怎么比在本地生成预览图更安全?
  • 为了向用户显示一个漂亮的预览,您必须先到服务器进行一次往返。使用 AJAX 是可能的。首先将文件上传到服务器比在本地生成预览图像更安全吗?偏执的安全只会造成干扰,但不能解决任何问题。
【解决方案2】:

您不应该使用“file://C:/localfile.jpg”而不是“C:/localfile.jpg”吗?

【讨论】:

  • 是的,但这个技巧只适用于 Windows 系统。在 Linux 下,您必须创建一个指向资源的符号链接并将链接放入同一网页并使用 src="..." 调用它。换句话说,据我尝试,“file://”前缀在 Linux 系统下无法使用,而在 Windows 系统下可以完美运行。
  • file:///localfile.jpg 对于 linux 来说是正确的
【解决方案3】:

除非您访问的是本地 html 页面,否则不允许浏览器访问本地文件系统。您必须在某处上传图像。如果与html文件在同一目录下,则可以使用&lt;img src="localfile.jpg"/&gt;

【讨论】:

  • 我试图使用绝对路径“/localfile.jpg”来实现相同的目的,但似乎浏览器将其视为“网络图像”并且找不到它。谢谢!
【解决方案4】:

C: 不是公认的 URI 方案。请改用file://c|/...

【讨论】:

  • 11 年后... :) 谢谢。
【解决方案5】:

老实说,最简单的方法是将文件托管添加到服务器。

  • 打开 IIS

  • 在默认网站下添加虚拟目录

    • 虚拟路径将是您要在浏览器中浏览的内容。因此,如果您选择“serverName/images,您将能够通过转到 http://serverName/images 来浏览它
    • 然后在C:盘上添加物理路径
  • 在 C: 驱动器上为“NETWORK SERVICE”和“IIS AppPool\DefaultAppPool”的文件夹添加适当的权限

  • 刷新默认网站

  • 你已经完成了。您现在可以通过导航到 http://yourServerName/whateverYourFolderNameIs/yourImage.jpg 浏览到该文件夹​​中的任何图像,并在您的 img src 中使用该 url

希望这对某人有所帮助

【讨论】:

    【解决方案6】:

    IE 9:如果您希望用户在将图像发布到服务器之前查看图像: 用户应将该网站添加到“受信任的网站列表”中。

    【讨论】:

      【解决方案7】:

      我们可以使用 javascript 的 FileReader() 和它的 readAsDataURL(fileContent) 函数来显示本地驱动器/文件夹文件。 将更改事件绑定到图像,然后调用 javascript 的 showpreview 函数。 试试这个 -

      <!doctype html>
      <html>
      
      <head>
          <meta charset='utf-8'>
          <meta name='viewport' content='width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;'>
          <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
          <title></title>
      
          <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      
          <script type="text/javascript">
          function showpreview(e) {
              var reader = new FileReader();
              reader.onload = function (e) {
                  $("#previewImage").attr("src", e.target.result);
              }
              //Imagepath.files[0] is blob type
              reader.readAsDataURL(e.files[0]);
          }
          </script>
      </head>
      <body >
          <div>
          <input type="file" name="fileupload" value="fileupload" id="fileupload" onchange='showpreview(this)'>
          </div>
          <div>
              &nbsp;
          </div>
          <div>
          <img width="50%" id="previewImage">
          </div>
      </body>
      </html>
      

      【讨论】:

      • Chrome 在控制台“不允许加载本地资源”中抛出错误。
      • @raosaeedali 抱歉回复晚了。如果我们想将本地驱动器中的图像直接显示到 HTML 页面的 img 标签中,那么我们需要提供相对路径。另一个解决方案是我们从输入类型文件中获取文件路径并将文件源分配给 img 标签,为此我更新了代码。
      • @RavindraVairagi 有没有办法在资源管理器中不选择文件的情况下显示图像?我尝试使用您的脚本,但没有收到“不允许加载本地资源”的错误,但我希望找到一种直接打印图像的方法,如果它存在...
      【解决方案8】:

      抛开 Newtang 对安全规则的观察,您如何知道查看您页面的任何人都会在c:\localfile.jpg 获得正确的图像?你不能。即使你认为你可以,你也不能。一方面,它以 Windows 环境为前提。

      【讨论】:

      • 除非你能。我没有在问题中提供太多背景信息,我知道 :) 但在这种情况下,我们实际上可以知道。
      • 如果他只计划在一个办公室中拥有 10 个用户,所有用户都具有 Windows 环境,并且 c:\localfile.jpg 中的图像正确。为此……他不仅可以完全知道正确的图像在那里,而且还可以控制它们。
      • 这个问题是有效的,因为他的要求是windows环境,服务的受众非常有限。例如,我在设计基于 Arduino 的 Web 服务器时遇到了同样的问题,其中唯一的客户端是与 Arduino 服务器位于同一 LAN 上的 Windows PC。 Arduino 向客户端提供图像的速度太慢,因此我需要将图像存储在客户端机器上。
      【解决方案9】:

      如果你使用谷歌 chrome 浏览器,你可以这样使用

      <img src="E://bulbpro/pic_bulboff.gif"   width="150px" height="200px">
      

      但如果你使用 Mozila Firefox,你需要添加“文件” ex.

      <img src="file:E://bulbpro/pic_bulboff.gif"   width="150px" height="200px">
      

      【讨论】:

      • 这在 chrome 中对我不起作用,但在 IE 中有效?
      • 这在 Linux 系统下无法使用,但在 Windows 系统中可以正常使用。
      【解决方案10】:

      我认为您正在尝试做的事情有两种可能性:

      1. 您希望在服务器上运行的网页在您最初设计的计算机上找到文件吗?

      2. 您希望它从正在查看页面的电脑上获取它吗?

      选项 1 没有意义 :)

      选项 2 将是一个安全漏洞,浏览器禁止网页(从网络提供)在查看者的机器上加载内容。

      Kyle Hudson 告诉了你你需要做什么,但这太基础了,我很难相信这就是你想做的全部。

      【讨论】:

        【解决方案11】:

        如果您只是为自己或某些客户部署本地网站,您可以通过在 cmd 中以管理员身份在网站根目录中运行 mklink /D MyImages "C:/MyImages" 来解决此问题。然后在html中,做&lt;img src="MyImages/whatever.jpg"&gt;,mklink建立的符号链接会将相对的src链接和你C盘上的链接连接起来。它为我解决了这个问题,所以它可以帮助其他提出这个问题的人。

        (显然这不适用于公共网站,因为您不能轻松地在人们的计算机上运行 cmd 命令)

        【讨论】:

          【解决方案12】:

          我尝试了很多技术,终于在C#端和JS端找到了一个。 您不能提供 src 属性的物理路径,但可以将 base64 字符串作为 src 提供给 Img 标记。 让我们看看下面的 C# 代码示例。

          <asp:Image ID="imgEvid" src="#" runat="server" Height="99px"/>
          

          C#代码

           if (File.Exists(filepath)
                                      {
                                          byte[] imageArray = System.IO.File.ReadAllBytes(filepath);
                                          string base64ImageRepresentation = Convert.ToBase64String(imageArray);
                                          var val = $"data: image/png; base64,{base64ImageRepresentation}";
                                          imgEvid.Attributes.Add("src", val);
                                      }
          

          希望这会有所帮助

          【讨论】:

            【解决方案13】:

            file:/// 开头并以filename 结尾应该可以工作:

            <img src="file:///C:/Users/91860/Desktop/snow.jpg" alt="Snow" style="width:100%;">
            

            【讨论】:

            • 注意:这个技巧在 Linux 系统中是行不通的。
            【解决方案14】:

            您还需要上传图片,然后链接到服务器上的图片。

            【讨论】:

              【解决方案15】:

              让图像成为用户选择的东西怎么样?使用 input:file 标签,然后在他们选择图像后,将其显示在客户端网页上?这对大多数事情都是可行的。现在我正试图让它在 IE 上工作,但与所有微软产品一样,它是一个集群 fork()。

              【讨论】: