2

我想做一些我在 web 开发中没有见过的东西,但这似乎是可能的。我想要一个可以放入任意 HTML<IMG/>标记或 CSSbackground-image属性的 URL,当访问时,它是一个随机图像。我不希望页面指向或重定向到随机图像,也不希望它显示或嵌入随机图像,因为这些东西不符合上述要求。我已经看到了使用 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 引用

4

2 回答 2

1

你当然可以用 PHP 做到这一点。

首先,选择一个随机文件(请参阅从目录中选择随机文件

function random_pic($dir = 'imagedir') {
    $files = glob($dir . '/*.jpg');
    if (!$files) return false;

    $file = array_rand($files);
    return $files[$file];
}

然后您可以使用 PHPreadfile函数将其发送给用户。您可以在此处阅读: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类型标题设置为image/jpegorimage/png等​​...

如果您只提供一种类型的图像,您总是可以设置 Apache 来处理对 PHP 脚本的“randomImage.jpg”请求,然后客户端浏览器绝对不会更明智。有关更多信息,请查看如何将所有请求重定向到文件,使用 Apache 的图像除外?(虽然你当然会做相反的事情)还检查 Apache 重写规则:http ://httpd.apache.org/docs/current/rewrite/flags.html

我还没有测试过这段代码,但它应该可以毫不费力地工作。希望有帮助!

于 2013-03-01T05:41:34.700 回答
1

你在运行 Apache 吗?有一个 RandomLocation Apache 模块可以处理这种事情。他们的文档几乎描述了您正在尝试做的事情

于 2013-03-01T05:43:18.657 回答