【问题标题】:URL to a random image [duplicate]随机图像的 URL [重复]
【发布时间】:2013-02-15 13:26:08
【问题描述】:

我想做一些我在 Web 开发中从未见过的事情,但这似乎是可能的。 我想要一个可以放入任意 HTML <IMG/> 标记或 CSS background-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 引用

【问题讨论】:

  • 看起来不错,但您可以使用fpassthru 读取所有字节并将它们更有效地写入输出。另外,请记住正确设置内容类型标头:)
  • 如果你知道怎么做,你能把它作为答案发布吗?
  • 抱歉,太忙了,但您的方向是正确的。

标签: css url image


【解决方案1】:

您正在运行 Apache 吗?有一个 RandomLocation Apache 模块可以处理这种事情。 Their docs describe almost the exact thing you're trying to do.

【讨论】:

  • 不,我使用的是 ASP.NET。不过谢谢!如果我切换,我会记住这一点:3
【解决方案2】:

你当然可以用 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 类型标头设置为image/jpegimage/png 等。 ..

如果您只提供一种类型的图像,您总是可以设置 Apache 来处理对 PHP 脚本的“randomImage.jpg”的请求,然后客户端浏览器绝对不会更明智。有关更多信息,请查看How to redirect all requests to a file, except images using Apache?(尽管您当然会做相反的事情)也请查看 Apache 重写规则:http://httpd.apache.org/docs/current/rewrite/flags.html

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

【讨论】:

  • 我正在bhstudios.org/_img/bg/rand 上尝试,但我什么也没看到...
  • 使用萤火虫,我看到它给出了 404 未找到。尝试在 if (!$filename) 中回显设置 404 标头的内容。看起来glob($dir . '/*.jpg')$dir 目录中搜索扩展名为.jpg 的文件返回false,请参阅php.net/manual/en/function.glob.php
  • 是的,glob 正在返回 false。我将“imagedir”更改为“/_img/bg”,但这似乎没有做任何事情。现在,该文件夹中的所有内容都是两个 PNG 文件(我还将对 jpg/jpeg 的引用更改为 png)
  • 您正在运行 ASP.NET 对吗?尝试为 glob 提供图像目录的完整路径和/或相对路径,例如:“C:\www_img\bg”或“..\.._img\bg”。如果您使用的是 Windows,请确保所有路径都是反斜杠(也尝试将 '/*.jpg' 中的路径更改为 '*.jpg')。如果您使用的是 Linux,则需要正斜杠。
  • 或者,甚至尝试完全从 glob 中删除路径,将图像文件放在与 PHP 脚本相同的目录中并使用:$files = glob('*.jpg');
猜你喜欢
  • 2020-09-25
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2015-10-27
相关资源
最近更新 更多