SEO-Software von Suchmaschinenoptimierung.de

Zufallsbild

(hier klicken, um zum Original Thread zu gelangen)
Mrloginman2
Hi,

ich versuche mich momentan daran, ein Zufallsbild auszugeben, aber bekomme nur nen Error 500 trotz chmod 755 -.-

Ist daran was falsch:

Zitat:
#! /usr/bin/perl

use strict;
use CGI;

use constant PUFFER => 4_096; # in Byte
use constand BILDDIR => "/usr/blabla"

my $q = new CGI; # erzeugt ein neues CGI Objekt
my $puffer = "";

my $bild = zufallsbild( BILDDIR, '\\.(png|jpg|gif)$' );
my $format = $bild =~ /\.(\w+)$/;
$format eq 'jpg' and $format = 'jpeg';

print $q->header( -type => "image/$format", -expires => "-1d"); # sofort verfallenden Browserheader senden
binmode STDOUT;

local *IMAGE;
open IMAGE, BILDDIR . "/$bild" or die 'Konnte die Datei nich oeffnen';
while (read(IMAGE, $puffer, PUFFER)) { }

close IMAGE;

sub zufallsbild {

my ($dir,$mask) = @_;
my $i = 0;
my $datei;
local (*DIR,$_);

opendir DIR, $dir or die 'Konnte das Verzeichnis nicht oeffnen';
while ( defined($_ = readdir DIR)) {
/$mask/o or next if defined $maske;
rand ++$i < 1 and $datei = $_;
}
closedir DIR;
return $datei;
}
}
artemis_TOAO
Ganz spontan:

1) Nach der zweiten Konstanten fehlt ein ;
2) Die letzte schließende geschweifte Klammer ist zuviel

Habe/hatte leider keine Zeit das Skript zu testen oder ähnliches.

Michael
Mrloginman2
Hm... Das Script will net so ganz ^^

Also mal kurz was ich eigentlich suche:

Ich suche ein Perl Script, welches ich per <img src="http://www.blabla.de/zufallsbild.pl"> anzeigen lassen kann. Das Script an sich soll bei jedem Aufruf der Seite ein anderes Bild zeigen.

Die Bilder sollen automatisch aus einem Ordner ausgelesen werden (also nicht jedes Bild manuell reinstellen)

Über dem Bild soll der Dateiname stehen, aber ohne die Erweiterung also z.b. Datei die angezeigt wird heißt bild.jpg

Dann soll Bild.jpg angezeigt werden und darüber soll stehen bild.

gehen tut das, aber ich weiß nicht genau wie wäre nett wenn man mir helfen könnte.

Beispielweise so:

baby
Baby
.iCode
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);
use LWP::MediaTypes qw(guess_media_type);

##############################################################################
#	Benutzerdefinierbare Variablen

# Pfad für Bilddateien (mit abschließendem Slash)
my $ImgPath =  '/var/www/html/images/';

#	Ende benutzerdefinierbare Variablen
##############################################################################

my @Bilder = GetDir( $ImgPath );
my $Zufallszahl = int( rand ( $#Bilder + 1 ) );
SendImage( $Bilder[$Zufallszahl] );

##############################################################################
#	Liefert ein Array mit allen Objekten in dem angegebenem Verzeichnisse
#	Parameter:
#	$Path		Das Verzeichnis aus dem die Objekte ausgelesen werden sollen
##############################################################################

sub GetDir {
	my ( $Dir, @Files, $File );
	
	# Zu öffnendes Verzeichnis holen
	$Dir = shift;
	
	# Versuche das Verzeichnis zu öffnen
	if( opendir( DIR, $Dir )) {
		
		# Alle Objekte einlesen ...
		@Files = readdir( DIR );
		
		# ... und Verzeichnis schließen
		closedir( DIR );
		
		foreach( @Files ) {
			if( $_ eq '.' || $_ eq '..' ) {
				undef $_;
			}
		}
		
		# Die ausgelesenen Objekte zurückgeben
		return @Files;
	}
	else {
		# Verzeichnis konnte nicht geöffnet werden, also geben wir eine leeres
		# Array zurück
		return @Files = ( );
	}
}

##############################################################################
#	Schickt das übergebene Bild an den Aufrufer zurück.
#	Übergabe
#	$Image		Dateiname des Bildes ohne Pfad.	
##############################################################################

sub SendImage {

	my ( $ImageToSend, $ImgSize, $ImgData, $Type, $MediaType );

	# Zu sendendes Bild holen
	$ImageToSend = $ImgPath . shift;

	# Datei zu öffnen versuchen
	if( open( IMAGE, "<$ImageToSend" )){

		# Browser-Caching deaktivieren
		print "Cache-Control: no-cache\n"; 
		print "Pragma: no-cache\n";

		# Dateigröße in Bytes bestimmen
		$ImgSize = -s IMAGE;

		# Sicherheitshalber auf Binärmodus schalten (Kleinweich sei Dank!)
		binmode( IMAGE );

		# Bilddaten binär einlesen
		read( IMAGE, $ImgData, $ImgSize );

		# Bilddatei wieder schließen
		close( IMAGE );

		# Medien-Typ bestimmen
		$Type = guess_media_type( $ImageToSend );
	}
	else {
		# Bild konnte nicht geladen werden, JPEG-Datei vortäuschen
		$Type = "image/jpeg";
	}

	# Browser-Medientyp zusammensetzen
	$MediaType = "Content-type: " . $Type . "\n\n";

	# Bilddaten an Aufrufer schicken
	print $MediaType;
	print $ImgData;
}
Mrloginman2
Hi,

immerhin kein 500er Error ^^ Aber ich bekomme nur das nette rote X guckst du --> http://paderchat.greatboard.de/zufallsbild.pl

Ich hab der Zufallsbild chmod 755 gegeben und der imageordner hat 777 und liegt in /srv/www/htdocs/web13/html/images/

Meine pl sieht so aus:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);
use LWP::MediaTypes qw(guess_media_type);

##############################################################################
#	Benutzerdefinierbare Variablen

# Pfad für Bilddateien (mit abschließendem Slash)
my $ImgPath =  '/srv/www/htdocs/web13/html/images/';

#	Ende benutzerdefinierbare Variablen
##############################################################################

my @Bilder = GetDir( $ImgPath );
my $Zufallszahl = int( rand ( $#Bilder + 1 ) );
SendImage( $Bilder[$Zufallszahl] );

##############################################################################
#	Liefert ein Array mit allen Objekten in dem angegebenem Verzeichnisse
#	Parameter:
#	$Path		Das Verzeichnis aus dem die Objekte ausgelesen werden sollen
##############################################################################

sub GetDir {
	my ( $Dir, @Files, $File );
	
	# Zu öffnendes Verzeichnis holen
	$Dir = shift;
	
	# Versuche das Verzeichnis zu öffnen
	if( opendir( DIR, $Dir )) {
		
		# Alle Objekte einlesen ...
		@Files = readdir( DIR );
		
		# ... und Verzeichnis schließen
		closedir( DIR );
		
		foreach( @Files ) {
			if( $_ eq '.' || $_ eq '..' ) {
				undef $_;
			}
		}
		
		# Die ausgelesenen Objekte zurückgeben
		return @Files;
	}
	else {
		# Verzeichnis konnte nicht geöffnet werden, also geben wir eine leeres
		# Array zurück
		return @Files = ( );
	}
}

##############################################################################
#	Schickt das übergebene Bild an den Aufrufer zurück.
#	Übergabe
#	$Image		Dateiname des Bildes ohne Pfad.	
##############################################################################

sub SendImage {

	my ( $ImageToSend, $ImgSize, $ImgData, $Type, $MediaType );

	# Zu sendendes Bild holen
	$ImageToSend = $ImgPath . shift;

	# Datei zu öffnen versuchen
	if( open( IMAGE, "<$ImageToSend" )){

		# Browser-Caching deaktivieren
		print "Cache-Control: no-cache\n"; 
		print "Pragma: no-cache\n";

		# Dateigröße in Bytes bestimmen
		$ImgSize = -s IMAGE;

		# Sicherheitshalber auf Binärmodus schalten (Kleinweich sei Dank!)
		binmode( IMAGE );

		# Bilddaten binär einlesen
		read( IMAGE, $ImgData, $ImgSize );

		# Bilddatei wieder schließen
		close( IMAGE );

		# Medien-Typ bestimmen
		$Type = guess_media_type( $ImageToSend );
	}
	else {
		# Bild konnte nicht geladen werden, JPEG-Datei vortäuschen
		$Type = "image/jpeg";
	}

	# Browser-Medientyp zusammensetzen
	$MediaType = "Content-type: " . $Type . "\n\n";

	# Bilddaten an Aufrufer schicken
	print $MediaType;
	print $ImgData;
}
milahu
füg das mal nach zeile 94 ein:
php:
1:
<?php $ImgData "$ImageToSend konnte nicht geoeffnet werden!"?>
Mrloginman2
THXXXXXXXXXXXX aber wieso werden manche Bilder nicht ganz geladen?
Noch ne Frage bzw. 2:

Wie bekomme ich den Namen über das jeweilige Bild? Und lässt sich die Maximale anzeigegröße beschränken?

Also alle Bilder anzeigen bis höchstens 250x250 aber kleinere bilder nicht vergrößern... ??
.iCode
Den Namen über das Bild bekommste nicht so leicht. Dafür müsstest du dich mit der GD Lib anfreunden (gibts die überhaupt in perl?). Alternativ kannst du natürlich auch den Text im HTML Document anzeigen lassen. Das wäre dann leichter zu realisieren.
Mrloginman2
Ich wollte das ganze eh über HTML ausgeben lassen fröhlich GDLib hab ich meines Wissens nach auch...
Mrloginman2
evtl. Lösungsvorschlag zu dem Dateinamenproblem? Augen rollen
keppi2
ja also ich wäre auch dran interesiert smile

Danke keppi
(hier klicken, um zum Original Thread zu gelangen)



Tipp: Ranking-Konzept.de - Das SEO-Forum (Forum rund um die Suchmaschinenoptimierung) der artaxo AG.
Das große Versicherungs ABC von Versicherung.de - mit allen Aspekten der Computerversicherungen!
Fan-Foren.de, die große Community mit Musikforum ist ab sofort online.