【问题标题】:Allow PHP to display local image files允许 PHP 显示本地图像文件
【发布时间】:2015-07-10 14:40:36
【问题描述】:

我想在我的 Windows 机器上显示存储在本地文件系统中的图像。

文件路径:D:/farewell/new/imagename.JPG

<html>
    <head>
        <title>
            Images Gallery
        </title>
    </head>
    <body>
        <?php
        $img="D:/farewell/new/IMG_0603.JPG";
        echo "<img src='$img' width=\"300\"/>";
        ?>
    </body>
</html>

网页没有加载任何图片,但是Inspect Element显示如下错误:

不允许加载本地资源:file:///D:/farewell/new/IMG_0603.JPG images.php:10

我怎样才能允许 PHP 或 Apache 网络服务器或 Chrome 浏览器(无论如何)允许访问存储在其他分区中的图像?

编辑

我想访问 D:/farewell/new/ 中的所有图像。我尝试在 httpd.conf 下为其设置别名,但这没有用,因为 url 无法提供给标签。

Alias /farewell/ "D:/farewell/2/"
<Directory "D:/farewell/2">
   Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

【问题讨论】:

  • 你不能。允许基于 Web 的内容请求/显示“本地”内容将是一个巨大的安全漏洞。即使有可能,让服务器告诉浏览器“相信我,没关系”,这将是一个更糟糕的安全问题。
  • @MarcB b 我知道它会,但我想在本地主机上使用它。我的服务器从不上线,我将它用于我将离线使用的应用程序。
  • 如果都是本地的,那么只需将 apache 设置为在您的文档根目录中使用这个 d:\farewell,例如一个Alias
  • PHP 可以访问服务器机器的本地文件系统并通过 http 提供(即发送)任何内容。浏览器可以访问客户端机器的本地文件系统,但由于它处理的是通过 http 发送的文档(即不是客户端文件系统的一部分),它不允许从“在”文件中。即使碰巧服务器和客户端在同一台机器上也是如此。访问是可能的,例如通过html5文件api,见html5rocks.com/en/tutorials/file/dndfiles
  • 是的,循环重新开始:转到评论 #1 ;-)

标签: php


【解决方案1】:

有可能 - 这是 Apache 2.4 Windows 版本。注意:要求全部授予,如此处所述:Alias 403 Forbidden with Apache

Alias /farewell "D:/farewell/2/"
<Directory "D:/farewell/2/">
    Options Indexes FollowSymLinks MultiViews ExecCGI
    AllowOverride all 
    Require all granted
</Directory>

...并且应该这样做;您应该能够访问具有以下效果的图像:

<img src="/farewell/[YOUR_IMAGE]" ... />

要显示文件夹中的所有图像,您可以执行以下操作:

$aF = scandir("D:/farewell/2");

foreach($aF as $file) {
  if(preg_match('/\.jpg|\.gif|\.png/', $file)) {
    echo "<img src=\"/farewell/{$file}\" alt=\"{$file}\" />\n";
  }
}

从技术上讲,您正在通过 HTTP 显示图像,但您正在使用 scandir() 从文件系统中检索图像文件名 - 从功能上讲,这几乎就是您所追求的。

简单地做&lt;img src=\"file:///D:/farewell/2/{$file}\" ... /&gt; 不会在任何现代浏览器中工作(据我所知)。


glob() 版本(使用我的 Steam 截图文件夹测试)

foreach(glob("D:/farewell/2/*.{jpg,gif,png}", GLOB_BRACE) as $file) {
  $sFile = strrchr($file, "/");
  echo "<div><img src=\"/farewell{$sFile}\" alt=\"{$sFile}\" /></div>\n";
}

【讨论】:

  • 但请记住,图像将通过 http 提供,而不是浏览器直接从本地文件系统读取。
  • 看,这就是区别。我想直接从本地文件系统读取,因为我想显示此文件夹中存在的所有图像。这可以使用 glob() 实现,它需要目录路径而不是 URL。
  • http 和显示所有图像并不矛盾。
  • @VolkerK 如果是这样,请您在这里回答stackoverflow.com/questions/31333171/…。我很乐意接受您的回答作为最佳答案
  • @kamal0808 - 已更新,这在功能上是您在给定文件夹中、网页上显示所有图像的功能……如果它在网页上,甚至在本地服务器,图像通过 HTTP 检索。
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2020-10-25
  • 1970-01-01
  • 2011-05-24
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多