I want to allow users to upload images to a folder, and having an image from that folder randomly displayed on the homepage. Is there a module out there that already does that, or has anyone already done this. It seems like something someone would have already done.

Comments

mshepherd’s picture

I'm pretty sure the image module provides a random image block, which may be useful to you, however this relies on image nodes, not uploaded images. Also, if you've gone the imagefield / imagecache route, it would be simple to create a view (using the views module) that generates a random image. Again, not really for uploaded images.

However, your question was regarding images that have been uploaded to a folder, and I've not come accross a Drupal 6 solution for this. For Drupal 5 there is http://drupal.org/project/random_images.

Sorry I can't help more.

rschwab’s picture

Paste this code into a .php file, and drop it into the directory where your images will reside. The script randomly selects an image from the folder its in when its called. So then in your <img> tag call the script as the src. For example <img src="http://www.mysite.com/sites/default/files/images/rotate.php">.

Here is the script:

<?php

/*

	AUTOMATIC IMAGE ROTATOR
	Version 2.2 - December 4, 2003
	Copyright (c) 2002-2003 Dan P. Benjamin, Automatic, Ltd.
	All Rights Reserved.

	http://www.hiveware.com/imagerotator.php
	
	http://www.automaticlabs.com/
	
	
	DISCLAIMER
	Automatic, Ltd. makes no representations or warranties about
	the suitability of the software, either express or
	implied, including but not limited to the implied
	warranties of merchantability, fitness for a particular
	purpose, or non-infringement. Dan P. Benjamin and Automatic, Ltd.
	shall not be liable for any damages suffered by licensee
	as a result of using, modifying or distributing this
	software or its derivatives.
	
	
	ABOUT
	This PHP script will randomly select an image file from a
	folder of images on your webserver.  You can then link to it
	as you would any standard image file and you'll see a random
	image each time you reload.
	
	When you want to add or remove images from the rotation-pool,
	just add or remove them from the image rotation folder.


	VERSION CHANGES
	Version 1.0
		- Release version
	
	Version 1.5
		- Tweaked a few boring bugs
	
	Version 2.0
		- Complete rewrite from the ground-up
		- Made it clearer where to make modifications
		- Made it easier to specify/change the rotation-folder
		- Made it easier to specify/change supported image types
		- Wrote better instructions and info (you're them reading now)
		- Significant speed improvements
		- More error checking
		- Cleaner code (albeit more PHP-specific)
		- Better/faster random number generation and file-type parsing
		- Added a feature where the image to display can be specified
		- Added a cool feature where, if an error occurs (such as no
		  images being found in the specified folder) *and* you're
		  lucky enough to have the GD libraries compiled into PHP on
		  your webserver, we generate a replacement "error image" on
		  the fly.
		
    Version 2.1
        - Updated a potential security flaw when value-matching
          filenames

    Version 2.2
        - Updated a few more potential security issues
        - Optimized the code a bit.
        - Expanded the doc for adding new mime/image types.

        Thanks to faithful ALA reader Justin Greer for
        lots of good tips and solid code contribution!


	INSTRUCTIONS
	1. Modify the $folder setting in the configuration section below.
	2. Add image types if needed (most users can ignore that part).
	3. Upload this file (rotate.php) to your webserver.  I recommend
	   uploading it to the same folder as your images.
	4. Link to the file as you would any normal image file, like this:

			<img src="http://example.com/rotate.php">

	5. You can also specify the image to display like this:

			<img src="http://example.com/rotate.php?img=gorilla.jpg">
		
		This would specify that an image named "gorilla.jpg" located
		in the image-rotation folder should be displayed.
	
	That's it, you're done.

*/




/* ------------------------- CONFIGURATION -----------------------


	Set $folder to the full path to the location of your images.
	For example: $folder = '/user/me/example.com/images/';
	If the rotate.php file will be in the same folder as your
	images then you should leave it set to $folder = '.';

*/


	$folder = '.';


/*	

	Most users can safely ignore this part.  If you're a programmer,
	keep reading, if not, you're done.  Go get some coffee.

    If you'd like to enable additional image types other than
	gif, jpg, and png, add a duplicate line to the section below
	for the new image type.
	
	Add the new file-type, single-quoted, inside brackets.
	
	Add the mime-type to be sent to the browser, also single-quoted,
	after the equal sign.
	
	For example:
	
	PDF Files:

		$extList['pdf'] = 'application/pdf';
	
    CSS Files:

        $extList['css'] = 'text/css';

    You can even serve up random HTML files:

	    $extList['html'] = 'text/html';
	    $extList['htm'] = 'text/html';

    Just be sure your mime-type definition is correct!

*/

    $extList = array();
	$extList['gif'] = 'image/gif';
	$extList['jpg'] = 'image/jpeg';
	$extList['jpeg'] = 'image/jpeg';
	$extList['png'] = 'image/png';
	

// You don't need to edit anything after this point.


// --------------------- END CONFIGURATION -----------------------

$img = null;

if (substr($folder,-1) != '/') {
	$folder = $folder.'/';
}

if (isset($_GET['img'])) {
	$imageInfo = pathinfo($_GET['img']);
	if (
	    isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
        file_exists( $folder.$imageInfo['basename'] )
    ) {
		$img = $folder.$imageInfo['basename'];
	}
} else {
	$fileList = array();
	$handle = opendir($folder);
	while ( false !== ( $file = readdir($handle) ) ) {
		$file_info = pathinfo($file);
		if (
		    isset( $extList[ strtolower( $file_info['extension'] ) ] )
		) {
			$fileList[] = $file;
		}
	}
	closedir($handle);

	if (count($fileList) > 0) {
		$imageNumber = time() % count($fileList);
		$img = $folder.$fileList[$imageNumber];
	}
}

if ($img!=null) {
	$imageInfo = pathinfo($img);
	$contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
	header ($contentType);
	readfile($img);
} else {
	if ( function_exists('imagecreate') ) {
		header ("Content-type: image/png");
		$im = @imagecreate (100, 100)
		    or die ("Cannot initialize new GD image stream");
		$background_color = imagecolorallocate ($im, 255, 255, 255);
		$text_color = imagecolorallocate ($im, 0,0,0);
		imagestring ($im, 2, 5, 5,  "IMAGE ERROR", $text_color);
		imagepng ($im);
		imagedestroy($im);
	}
}

?>

- Ryan

jarea’s picture

I copied the rotate.php script and images to a directory, put in an <img ....rotate.php"> tag as you described in the otherwise empty body of a node and get nothing.

As a test, I changed the <img> tag to reference one of the images and the image displays fine.

As another test, also tried the <img .../rotate.php"> tag in an html page on a non-Drupal site and it rotated the images just fine.

Is there a problem referencing the rotate.php script from a node body field?

Wassim Ghannoum’s picture

it will work for u, i'm sure

just go to Administer->Site Building->Modules and then enable the module named (PHP filter), it allows u to embeed a php code in ur body...

then make a new node, enter a title, and the in the body write Only local images are allowed.

in the filter of the node select php code.... and now test it..

jarea’s picture

Thanks for the reply abou.

I have PHP filters activated and have tried it using that input filter without success.

You said

and the in the body write

What did you have in mind? Write the img tag? Include the whole script as part of the image tag?

rschwab’s picture

When I used this script I called it from my page.tpl.php file, instead of in the actual $content of the page... but it seems that if you have the correct input filters on it should work correctly either way.

You just call the script in the img src, like so: <img src="http://www.mysite.com/my/path/rotate.php">. No need to include the whole script elsewhere if its already saved on your server.

Maybe you could post a code snippet of what you're doing, or a link so we can see? Its not clear whats going wrong from just the above info.

- Ryan

jarea’s picture

I just tried it on a virgin clean install of Drupal using Full HTML ... no TinyMCE, no extra modules. I did confirm that the <img src> tag does work when I have it hard coded with an image file. But as for the call to rotate.php, it does not work. It must have something to do with putting the call to the php file in the body of the node.

Since the only place I have seen it reported that this does work is via a call from a tpl.php file, I will try to play with that and see if I can get what I am looking for. I'll report back if I have any success.

Note: I had to go back and change the subject because it came out "I just tried it on a virgin" - ROTFL

jarea’s picture

Just to wrap up this issue for me. I finally wound up writing a simple little PHP script in a node to rotate the images. It works fine.

peterulf’s picture

Could you give that script away? thanks

zooterthresden’s picture

thanks for the post.
i got it to work after i realized that i had not copied the entire highlighted area. i missed that very first <?php tag. when i pasted the script into my editor, none of the lines became colored. duh. i went back and copied the whole section, comments and all, and lo and behold.

thanks a lot!

lordmwesh’s picture

Mine does not seem to work with internet explorer but works fine with Firefox

I got the solution, the Only local images are allowed. tag must have the width and height set.