0

以下问题我无法真正解决问题,所以如果你们不费心提供整个代码,那么一些正确方向的提示会很棒!

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

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

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

4

4 回答 4

2

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

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

于 2012-10-23T21:21:35.283 回答
2

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

一些例子;

基于数据 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 页面中,您将拥有以下代码段

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 脚本。在这两种情况下,通过在数据库中存储映射来抽象出服务器上二进制文件的真实路径。

于 2012-10-23T21:24:33.630 回答
1

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

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

style="background-image:url('script.php?img=30382');"
于 2012-10-23T21:22:43.797 回答
0

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

于 2012-10-23T21:23:24.903 回答