【问题标题】:PHP: set image as background without revealing pathPHP:将图像设置为背景而不显示路径
【发布时间】:2012-10-23 21:18:19
【问题描述】:

下面的问题我实在是想不通,所以如果你们不费心提供整个代码,一些正确方向的提示会很棒!

所以,我有一个脚本,用户可以将图像上传到服务器。 PHP 负责验证文件并使用客户端不知道的另一个文件夹中的新文件名将其保存。现在,客户端应该可以看到上传的图片,简单的 html 格式:

style="background-image:url('testimagegif.gif');

但最好客户端不能看到保存在服务器上的图像的路径和文件名。我知道使用header('Content-type: ... 来强制客户端浏览器下载文件,但我不知道这是怎么回事,也没有任何类似的解决方案可以应用于这种情况。 readfile 也是如此。如果我使用它,浏览器只会下载图像,而不是将其放在 html 中。

【问题讨论】:

  • 您认为如何在不向客户提供图像路径的情况下将图像提供给客户?为什么要隐藏路径?
  • 哦,也许我表达的不清楚,但用户自然必须看到一个路径,就像在 html 示例中一样。我正在寻找的是一些基本上从服务器复制图像的代码,将文件名(和路径)更改为随机名称,浏览器可以使用该名称来获取正确的图像。换句话说,“复制”图像的路径可以是临时的,即使对于每次页面加载,只要“真实”路径保密。
  • 你真的不必给用户一个路径。只是一些标识符。如果您有一个 ID-path 的键值对,只需使用 ID 即可轻松提供。

标签: php content-type readfile


【解决方案1】:

如果您想提供这些文件,您可能应该将这些文件移动到您的网络服务器上一个公开可读的文件夹中。

否则,您将需要 readfile() 之类的东西

【讨论】:

  • readfile 是个好主意,但我不知道如何使用它在 HTML 中放置图像。使用它我得到的只是浏览器下载图像。
  • 您可以将图像的src 指向PHP 脚本,例如image.php?path=someimage.jpg - 脚本还需要输出正确的Content-Type 标头。
  • 我认为这就是style="background-image:url(' <?php ...readfile($file); 所做的,正如我在上面托比的评论中所发布的那样。不过效果一样。浏览器下载图片。
  • 不,这是试图在同一个脚本中执行 readfile。您需要获取输出 HTML/CSS 以向 PHP 脚本发出单独的请求以获取图像。
【解决方案2】:

有两种选择,您可以使用数据协议,它将整个图像嵌入到背景的 URL 中(如果图像大于几 kb,则不建议这样做。)或者您可以使用通过编码或记录图像的唯一键来呈现图像的脚本,例如 bg.php?id=4323-34442-3432-4532 检查 db 的 id 以检索文件路径,然后用正确的内容回显内容类型。

一些例子;

基于Data URI 维基百科页面

数据 URI 方法

假设这样的函数;

 function data_uri($fileID) {
     $fRecord = mysql_fetch_array(
         mysql_select("SELECT filePath, mimeType from fileTable WHERE fileID = " $fileID . ";")
     );
    $contents = file_get_contents($fRecord['filePath']);
    $base64 = base64_encode($contents);
    return "data:$fRecord['mimeType'];base64,$base64";
}

然后在您的 html/php 页面中,您将拥有以下 sn-p

style="background-image:url('<?php echo data_uri($fileID);?>'

PHP 图像转储

假设这样的函数;

// Given a filename and a mimetype; dump the contents to the screen
function showDocumentContent($fileID){
     $fRecord = mysql_fetch_array(
         mysql_select("SELECT filePath, mimeType from fileTable WHERE fileID = " $fileID . ";")
     );
    header( 'Content-Encoding: none', true );       
    header( 'Content-Type: ' . $fRecord['mimeType'], true );
    echo readfile( $fRecord['filePath'] );
}

然后在你的 html 页面中你会有这个;

style="background-image:url('image.php?fileID=123')

在第一种情况下,大于几 KB 的图像将产生同样大的 HTML 页面,并且可能不会在浏览器中得到一致的支持。在第二种情况下,您实际上已经创建了一个伪装成图像的 php 脚本。在这两种情况下,服务器上二进制文件的真实路径都是通过在数据库中存储映射来抽象出来的。

【讨论】:

  • 确实是一个很好的建议,但我如何在正确的位置回显图像。使用readimage,如下所示,浏览器会立即下载图像,而无需将其放置在 html 中的任何位置。代码类似于:style="background-image:url(' &lt;?php readfile($file);。如果你明白我的意思。不是复制代码示例的最佳位置
  • 我已经通过一些更具体的示例对我的原始答案进行了一些更改。请注意,我是在没有实际运行任何东西的情况下编写的,因此它不会“开箱即用”,但是,我希望它为提议的解决方案提供一些更清晰的背景。
  • 这确实是一个非常全面的答案。我必须稍后检查一下!感谢您的贡献!
【解决方案3】:

如果您将文件的路径存储在数据库或文件之类的位置,则可以在检索路径后使用readfile() 输出文件。

将其与content-type 标头组合,并使用正确的查询字符串将background-image URL 设置为PHP 脚本,如下所示:

style="background-image:url('script.php?img=30382');"

【讨论】:

  • 确实是我正在寻找的东西。但即使我将标题设置为header('Content-Type: image/gif');,浏览器也会立即下载图像。
【解决方案4】:

您必须向客户端公开一些路径,因为他们的浏览器必须访问该文件。您可以使用您的网络服务器配置在间接位置提供服务,或者使用 PHP 提供图像并在调用 readfile() 时获取真实路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2015-11-22
    相关资源
    最近更新 更多