Wie per PHP auf /photo zugreifen

Status
Für weitere Antworten geschlossen.

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

wie kann ich aus dem Webdienst auf die Bilder in dem Phtostation Verzeichnis (/photo) zugreifen?
Ich kann die Dateinamen zwar lesen, doch ein einzelnes Bild öffnen klappt nicht.

Warum? Ich möchte eine eigene Slideshow per PHP erstellen die die Bilder direkt aus dem Photostation Verzeichnis liest.


Ich kann mich erinnern mal einen Trick hierfür gesehen zu haben, finde ihn aber nicht mehr.


Olaf
 

Nasenmann

Benutzer
Mitglied seit
01. Feb 2010
Beiträge
41
Punkte für Reaktionen
0
Punkte
0
Hallo,

dazu mußt du nur deinen Ordner photo in den Ordner web mounten...

Manuell ein- und ausbinden:
Rich (BBCode):
mount --bind /volume1/photo/ /volume1/web/photo/

umount /volume1/web/photo/

Du kannst auch mal die Suchfunktion des Forums nutzen. Irgendwo gibts nen Beitrag zu dem Thema. Da wird auch ne automatische einbindung beim booten mit nem Script beschrieben. Mit itaris Admin Tool müßte es auch möglich sein den Ordner zu mounten.

Gruß
Nasenmann
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

danke schonmal, werde im Forum suchen. An das Admin Tool wage ich mich nicht so recht ran - nahezu Null-Ahnung von Linux Commandline.

Ansonsten habe ich das Problem, dass ich über PHP auf die Fotos und Verzeichnisse in /photo zugreifen kann - kann selbst die Größe eines Bildes (X x Y) kann ich ermitteln ... - nur das Bild ANZEIGEN klappt nicht.

Olaf
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ansonsten habe ich das Problem, dass ich über PHP auf die Fotos und Verzeichnisse in /photo zugreifen kann - kann selbst die Größe eines Bildes (X x Y) kann ich ermitteln ... - nur das Bild ANZEIGEN klappt nicht.
Nochmals die Frage: Welche Fehlermeldung seitens PHP kommt denn? Bzw wie genau versuchst du das Bild zu Anzeige zu bringen?
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

es kommt KEINE Fehlermeldung - das Bild wird einfach nicht angezeigt. Wenn ich per Adresszeile es Browsers versuche auf das Bild zuzugreifen, gibts die Standard Synology Meldung "Es tut uns Leid, die von Ihnen gesuchte Seite konnte nicht gefunden werden."

PS: Wenn ich /photo direkt aufrufe haben die Bilder auch nur kryptische URLS.

Olaf
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

ich will auf meine Fotos (ca. 60.000) per PHP zugreifen und
1. ein zufälliges Verzeichnis wählen
2. in diesem Verzeichnis ein Bild (zufällig) wählen
3. Bild anzeigen.
Hier verwende ich diesen Code - der in /web/slideshow/ liegt. Versuchs mal selbst:
PS: Code ist noch nicht "schön" und lässt sich noch optimieren - ich weiß.

PHP:
<?php 
/*
By Olaf Nöhring, 2010, http://www.team-noehring.de

Purpose of this script:
	Read a RANDOM file in a RANDOM subdirectory and return this file (image in this specific case).
	Example: Show a random image

Problem or - why is this script needed:
	There are about 60.000 files in the subdirectories that are in our pool of possible files.
	Other methods I found were not able to recreate this effect since the PHP execution time always ran our (of it produced memory problems).
	This should be quite easy and fast.
*/

//Define source directory, no trailing slash! Example "../photo" NOT this: "../photo/"
$source_directory = "../../photo";
//./html/projekte/bilder";

//What width and height is the maximum for the pictures (in pixel!)
//TO BE SET AT A LATER TIME!
$max_width = 200;
$max_height = 200;

//--------------- NO CHANGES BELOW REQUIRED ----------------------

//STart randomizer (Base: time)
srand((double)microtime()*1000000);  

//array of files without directories... optionally filtered by extension 
function file_list($d,$x){ 
       foreach(array_diff(scandir($d),array('.','..','@eaDir','lost+found')) as $f)if(is_file($d.'/'.$f)&&(($x)?preg_match($x,$f):1))$l[]=$f; 
       return $l; 
} 

//array of directories 
function dir_list($d){ 
		// Next line removed from array to have access to a path where the recursive algorithm is in at a certain time
		// '.',
       foreach(array_diff(scandir($d),array('..','@eaDir','lost+found')) as $f)if(is_dir($d.'/'.$f))$l[]=$f; 
       return $l; 
}

//Choose randomly a directory from which an image should be picked
function choose_dir($calculated_dir) {
	$directories = dir_list($calculated_dir);
	
	//Choose a directory in the initial source directory. It's possible to choose the source directory itself (Value: @eaDir on a Synology DS209)
	$count_dirs = count($directories);
	$random = (rand()%$count_dirs);	
	
	//START debug
		echo "<hr>V1:Verzeichnisse in <strong>". $calculated_dir  ."</strong>:<br>";
		print_r($directories);
		echo "<br>----V2:Gewähltes Verzeichnis: ". $directories[$random];	
		echo "<br>----V3:Länge Verzeichnis: ". strlen($directories[$random]);	
	//END DEBUG	
	
	return $directories[$random];
}


//Choose an image from the previously calculated directory
function choose_file ($s_dir) {
	//Choose filename in the chosen directory:
	$dateien = file_list($s_dir,'(gif|GIF|png|PNG|jpg|JPG)');

	//We do not shuffle the array itself, because we do not need to and I suppose this would take more time. We need only 1 part of the array!
	//Choose ONE File to return:
	$count_files = count($dateien);
	if ($count_files ==0) {
		return "/no-file/";
	}
	$random = (rand()%$count_files);
	
	//$return = $s_dir."/".$dateien[$random];
	$return = $dateien[$random];
	//START debug
		//echo "<hr>Dateien:<br>";
		//print_r($dateien);
		//echo "<br><br>Gewählte Datei: ". $return;
	//END DEBUG
	return $return;
}

// Calculates restricted dimensions with a maximum of $goal_width by $goal_height 
function resize_dimensions($goal_width,$goal_height,$width,$height) { 
    $return = array('width' => $width, 'height' => $height); 
    
    // If the ratio > goal ratio and the width > goal width resize down to goal width 
    if ($width/$height > $goal_width/$goal_height && $width > $goal_width) { 
        $return['width'] = $goal_width; 
        $return['height'] = $goal_width/$width * $height; 
    } 
    // Otherwise, if the height > goal, resize down to goal height 
    else if ($height > $goal_height) { 
        $return['width'] = $goal_height/$height * $width; 
        $return['height'] = $goal_height; 
    } 
    
    return $return; 
}
function getmicrotime()
{
	list($usec, $sec) = explode(" ",microtime());
	return ($usec + $sec);
}

$Laufzeit = getmicrotime();

//Test if a single image is being returned
//echo "<br>Testausgabe einer Datei in Verzeichnis: ".choose_file($source_directory)."<br>";

$target_dir = "";
while ($target_dir != '/.') {
  $source_directory = $source_directory.$target_dir;
  $target_dir = '/'. choose_dir ($source_directory);
}
echo "<br>Am Ende:" . $source_directory  ."<br>";


//Resize Image if needed and output it - we are done
	$target_file = choose_file($source_directory);
	if ($target_file == "/no-file/") {
		//maybe there is no file in the directory
			//ggf. Function !
	}
	$image = $source_directory."/".$target_file;
	// Usage example to find the proper dimensions to resize an image down to 300x400 pixels maximum: 
	list($width, $height) = getimagesize($image); 	
	$new_dimensions = resize_dimensions($max_width,$max_height,$width,$height); 
	echo "<hr><br>Link: ". $image;
	?>
		<br>
		<img src="<?php echo $image; ?>" width="<?php echo $new_dimensions[width]; ?>" height="<?php echo $new_dimensions[height] ?>
">		
<br>Fertig


<?php
$Laufzeit = getmicrotime() - $Laufzeit;
echo "<br>Laufzeit: ". $Laufzeit;
?>
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
es kommt KEINE Fehlermeldung - das Bild wird einfach nicht angezeigt.
Und das folgende geht auch ned?
PHP:
error_reporting(E_ALL);
ini_set('display.errors','1');
$str = file_get_contents('/volume1/photo/album/bild.jpg');
header('Content-Type: image/jpg');
echo $str;
Wenn du die Grösse ja auslesen kannst, heisst das, dass php auf die Dateien zugreifen darf. Also müsste eigentlich auch das Anzeigen klappen
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo nochmal
hier ein Screenshot des obigen Codes:

foto01.png


Olaf
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Kannst du mal den html Quellcode posten von der Seite wo das Bild angezeigt werden sollte?
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

1. Dein Code klappt - deer absolute Pfad funzt (wäre ja eigenlich auch möglich).

2. Der Quellcode der im Browser erscheint:
HTML:
<hr>V1:Verzeichnisse in <strong>../../photo</strong>:<br>Array
(
    [0] => .
    [1] => Antje
    [2] => Birgit 25. Geburtstag
    [3] => Hochzeitsfeier 2009-02-14
    [4] => Isenbüttel, August 2007
    [5] => USA
    [6] => USA 2003
    [7] => USA 2004
    [8] => USA 2007
    [9] => USA 2008
    [10] => USA 2008 Sommer
    [11] => USA 2008 Winter
    [12] => USA 2009 Herbst
    [13] => USA 2009 Pfingsten
    [14] => USA 2010
    [15] => Umzug Oma, Mond, OKI Drucker
    [16] => Umzugsbilder Willigigsstraße 12-2005
    [17] => pars
    [18] => von_IMG_PC
)
<br>----V2:Gewähltes Verzeichnis: Hochzeitsfeier 2009-02-14<br>----V3:Länge Verzeichnis: 25<hr>V1:Verzeichnisse in <strong>../../photo/Hochzeitsfeier 2009-02-14</strong>:<br>Array
(
    [0] => .
    [1] => erwin und antje
    [2] => mutti
)
<br>----V2:Gewähltes Verzeichnis: erwin und antje<br>----V3:Länge Verzeichnis: 15<hr>V1:Verzeichnisse in <strong>../../photo/Hochzeitsfeier 2009-02-14/erwin und antje</strong>:<br>Array
(
    [0] => .
)
<br>----V2:Gewähltes Verzeichnis: .<br>----V3:Länge Verzeichnis: 1<br>Am Ende:../../photo/Hochzeitsfeier 2009-02-14/erwin und antje<br><hr><br>Link: ../../photo/Hochzeitsfeier 2009-02-14/erwin und antje/IMG_2670.JPG		<br>
		<img src="../../photo/Hochzeitsfeier 2009-02-14/erwin und antje/IMG_2670.JPG" width="200" height="150">		
<br>Fertig


<br>Laufzeit: 7.72445893288
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Code:
[COLOR=#800080][FONT=monospace]
[/FONT][/COLOR]<img src="../../photo/Hochzeitsfeier 2009-02-14/erwin und antje/IMG_2670.JPG" width="200" height="150">
Wenn du dich direkt in einem Unterverzeichnis von web befindest, dann kannst du nicht ../../ machen. Das kann ein Client nicht aufrufen, weil er damit über den DocumentRoot hinausgehen würde. Wenn du dich also in /volume1/web/blabla befindest würde der Client mit ../../ in /volume1 landen und das ist ausserhalb des Erlaubten (/volume1/web).
Lass ../../ weg und schreib einfach
Code:
<img src="/photo/Hochzeitsfeier 2009-02-14/erwin und antje/IMG_2670.JPG" width="200" height="150">
Zusätzlich sollten URLs keine Leerzeichen haben. Ich würde also den Pfad vor der Ausgabe im Browser noch mit url_encode() behandeln
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

danke. Hab den Wald wohl vor lauter Bäumen nicht gesehen.
Werde es ausprobieren. Die Idee mit URLencode ist gut - hab ich aber hier nicht drinnen da er sonst auch die "/" kodiert.


.... leider klappts nicht....
Hier nochmal der Code der den Screenshot unten entstehen lässt. Auch nochmal die URL direkt in die Adresszeile gepasted.

HTML:
<hr>V1:Verzeichnisse in <strong>../../photo</strong>:<br>Array
(
    [0] => .
    [1] => Antje
    [2] => Birgit 25. Geburtstag
    [3] => Hochzeitsfeier 2009-02-14
    [4] => Isenbüttel, August 2007
    [5] => USA
    [6] => USA 2003
    [7] => USA 2004
    [8] => USA 2007
    [9] => USA 2008
    [10] => USA 2008 Sommer
    [11] => USA 2008 Winter
    [12] => USA 2009 Herbst
    [13] => USA 2009 Pfingsten
    [14] => USA 2010
    [15] => Umzug Oma, Mond, OKI Drucker
    [16] => Umzugsbilder Willigigsstraße 12-2005
    [17] => pars
    [18] => von_IMG_PC
)
<br>----V2:Gewähltes Verzeichnis: USA 2009 Herbst<br>----V3:Länge Verzeichnis: 15<hr>V1:Verzeichnisse in <strong>../../photo/USA 2009 Herbst</strong>:<br>Array
(
    [0] => .
    [1] => Nachbestellung
    [2] => PARs
    [3] => Panorama
    [4] => Panorama-einzelne Bilder
)
<br>----V2:Gewähltes Verzeichnis: Panorama-einzelne Bilder<br>----V3:Länge Verzeichnis: 24<hr>V1:Verzeichnisse in <strong>../../photo/USA 2009 Herbst/Panorama-einzelne Bilder</strong>:<br>Array
(
    [0] => .
)
<br>----V2:Gewähltes Verzeichnis: .<br>----V3:Länge Verzeichnis: 1<br>Am Ende:../../photo/USA 2009 Herbst/Panorama-einzelne Bilder<br><hr><br>Link: /photo/USA 2009 Herbst/Panorama-einzelne Bilder/IMG_4917.JPG		<br>
		<img src="/photo/USA 2009 Herbst/Panorama-einzelne Bilder/IMG_4917.JPG" width="150" height="200">		
<br>Fertig


<br>Laufzeit: 11.5120949745

------------------
foto02b.png

------------------
foto02.png


Olaf
 

Trolli

Benutzer
Mitglied seit
12. Jul 2007
Beiträge
9.848
Punkte für Reaktionen
1
Punkte
0
Das funktioniert doch nicht, weil /photo ja die Photo Station ist und da gibt es diesen Link eben nicht, oder?
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hast du es mal mit einem Bild ohne Leerzeichen in der URL probiert? Kannst du dieses problemlos aufrufen?
@trolli
Eigentlich ist /photo ja ein Alias auf /volume1/photo. Der sollte so in der Apache Conf gesetzt sein. Damit müsste der Zugriff imho eigentlich klappen.
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo Trolli, jahlives

Ja, den Link gibtsin der Photostation nicht - aber ich würde eben gern auf die Bilder zugreifen. Was ist eben nicht verstehe: Über interne PHP Kommandos kann ich auf die Datei zugreifen.

Nein, es klappt auch nicht bei einem Bild OHNE Sonderzeichen wie
Rich (BBCode):
/photo/USA/IMG_1426_k_sagem.jpg

Vielleicht sollte ich den absoluten Pfad nutzen wie schon vorgeschlagen z.B.
HTML:
<img src="/slideshow/zufallsbild.php">

Sehe ich es richtig, dass ich die Größenanpassung dann eben auch danach machen müsste also so:
PHP:
getimagesize("/slideshow/zufallsbild.php")



Olaf
 

Trolli

Benutzer
Mitglied seit
12. Jul 2007
Beiträge
9.848
Punkte für Reaktionen
1
Punkte
0
Nein, /photo ist ein Alias auf /usr/syno/synoman/webman/photo. Deswegen klappts nicht.
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

das hat aber geklappt - uns ist noch ein anderer Pfad (als von dir angegeben):
PHP:
error_reporting(E_ALL);
ini_set('display.errors','1');
$str = file_get_contents('/volume1/photo/album/bild.jpg');
header('Content-Type: image/jpg');
echo $str;

Olaf
 

Trolli

Benutzer
Mitglied seit
12. Jul 2007
Beiträge
9.848
Punkte für Reaktionen
1
Punkte
0
Ja, damit greifst Du ja direkt auf den Pfad zu und nicht über PHP. Das macht in diesem Fall den Unterschied.
 

ong10

Benutzer
Mitglied seit
20. Mai 2010
Beiträge
262
Punkte für Reaktionen
3
Punkte
18
Hallo,

habe mir erstmal mit dem direkten beholfen. Muss erstmal weg, melde mich ggf. nochmal (bin ja auch noch verpflichtet den aktuellen Code hier zum besten zu geben).
Ich hatte nämlich nix gefunden das es ermöglicht, aus zig Unterverzeichnissen und über 60.000 Bildern eines zufällig auszuwählen.

Riesen Dank schonmal

Olaf
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat