以下问题我无法真正理解,所以如果你们不能为提供整个代码而烦恼,那么一些领先于正确方向的技巧会很棒!
所以,我有一个脚本,用户可以将图像上传到服务器。 PHP负责验证文件,并使用另一个文件夹中的新文件名保存文件,客户端都不知道。现在,客户端应该能够在html中看到上传的图像:
style="background-image:url('testimagegif.gif');
但最好是客户端不应该能够看到服务器上保存的图像的路径和文件名。我知道使用header('Content-type: ...
强制客户端浏览器下载文件,但我没有看到这个,也没有任何类似的解决方案可以应用于这种情况。同样适用于readfile
。如果我使用它,浏览器只需下载图像,而不是将其放在html中。
答案 0 :(得分:2)
如果要提供服务,您可能应该将文件移动到网络服务器上的公共可读文件夹中。
否则,您需要readfile()
答案 1 :(得分:2)
有两种选择,您可以使用数据协议,它将整个图像嵌入到背景的URL中(如果图像大于几kb,则不建议这样做。)或者您可以使用通过编码或记录图像的唯一键来显示图像的脚本,例如bg.php?id = 4323-34442-3432-4532,它检查数据库的id以检索文件路径,然后用右边的内容回显内容内容类型。
一些例子;
基于Data 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);?>'
假设有这样的功能;
// 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脚本。在这两种情况下,通过在数据库中存储映射来抽象出服务器上二进制文件的真实路径。
答案 2 :(得分:1)
如果将路径存储到某个位置(如数据库或文件),则可以在检索路径后使用readfile()
输出文件。
将其与content-type
标头合并,并使用正确的查询字符串将background-image
URL设置为PHP脚本,如下所示:
style="background-image:url('script.php?img=30382');"
答案 3 :(得分:0)
您必须向客户端公开某些路径,因为他们的浏览器必须访问该文件。您可以使用您的网络服务器配置在间接位置投放,或使用PHP提供图像,并在调用readfile()
时拥有真实路径