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

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.

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

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?

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..

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?

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

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

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.

Could you give that script away? thanks

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!

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.

He who dares, Wins