我想制作一些我在网络开发中没有看过的东西,但似乎有可能。 我想要一个可以放入任意HTML <IMG/>
标记或CSS background-image
属性的网址,当访问该网址时, 是一个随机图片。我不希望页面指向或重定向到随机图像,我不希望它显示或嵌入随机图像,因为这些东西不适用于上述要求。我已经看到了使用Javascript交换属性或隐藏元素在网页中显示随机图像的解决方案,但这必须使整个页面成为图像,没有先前或后续的二进制或ASCII数据。我希望那些对编程一无所知的人可以使用它。我的目标是这样的:
http://example.com/randomImage/
理论上,每次在CSS或HTML中使用此URL加载页面时,随机图像将显示在引用的元素中。它应该有效,以便如果您有多个<IMG/>
元素或多个元素及background-image
引用此页面,则它们都应显示随机不同的图像。
我的第一个想法是使用PHP(在下面描述的结构中)查看特定目录,随机选择图像文件,并回显其二进制数据。 如果可以,那我该怎么做呢?如果没有,那么有没有人有任何其他想法?
我的主要想法是伪代码:
<?PHP
$chosenImage = getRandomFileFrom("./rand/");
$bytes = readFileAsBinary($chosenImage);
foreach($bytes as $byte){
echo $byte;
}
?>
我不关心真或伪随机。它可以每次循环我所关心的一切;我在这项工作中需要的是,多个图像可以作为单个URL引用
答案 0 :(得分:1)
你当然可以用PHP做到这一点。
首先,选择一个随机文件(参见Select random file from directory)
function random_pic($dir = 'imagedir') {
$files = glob($dir . '/*.jpg');
if (!$files) return false;
$file = array_rand($files);
return $files[$file];
}
然后您可以使用PHP readfile
函数将其发送给用户。您可以在此处阅读:http://www.php.net/readfile请参阅示例1,我在下面稍作修改:
function outputImage( $filename ) {
header('Content-Description: File Transfer');
header("Content-type: image/jpeg");
header('Content-Disposition: attachment; filename='.basename($filename ));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filename ));
ob_clean();
flush();
readfile($filename );
exit;
}
然后将它们全部拉到一起:
// Get a filename
$filename = random_pic();
// Check that a file was found
if (!$filename) {
header('HTTP/1.0 404 Not Found');
die();
}
// Output the image
outputImage( $filename );
您还可以更改$files = glob($dir . '/*.jpg');
以查找不同的图片格式,但您还必须更改outputImage
以检测格式并将Content-type
类型标头设置为{{1 }}或image/jpeg
等...
如果您只提供一种类型的图像,您可以随时设置Apache来处理对'scriptImage.jpg'的请求到PHP脚本,然后客户端浏览器绝对不会更聪明。有关详细信息,请查看How to redirect all requests to a file, except images using Apache?(尽管您当然会反其道而行之)同时查看Apache重写规则:http://httpd.apache.org/docs/current/rewrite/flags.html
我没有测试过这段代码,但它应该没有太多努力。希望有所帮助!
答案 1 :(得分:1)
你在运行Apache吗?有一个RandomLocation Apache模块可以处理这种事情。 Their docs describe almost the exact thing you're trying to do.