Copy funktioniert nicht für einen bestimmten Verzeichnisname

h2000

Grünschnabel
Hallo Leute,

ich bin echt am (ver-)zweiflen. Ich kopiere mit PHP eine Datei von a nach b, wenn der letzte Verzeichnisname in meinem Target 'slideshow' ist, wie zb. wenn der Copy-Befehl:

Code:
copy('/home/files/bild1.jpg','/home/ziel/unterverzeichnis/unterverzeichnis/slideshow/bildziel.jpg');
lautet funktioniert der Copy-Befehl nicht, ohne eine einzige Fehlermeldung, wenn ich jetzt den Name des letzten Verzeichnisses nur ein wenig ändere zb in :

Code:
copy('/home/files/bild1.jpg','/home/ziel/unterverzeichnis/unterverzeichnis/slideshows/bildziel.jpg');
dann funktioniert es... was soll das? Schau ich vielleicht an die ganz falsche Stelle?

thx

hauke
 
Hi und Willkommen bei tutorials.de :)

Gibts bei der fehlerhaften Version das Verzeichnis überhaupt?

Hast du
PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
am Skriptanfang?
 
Also wenn du Unix verwendest und dann in irgendwelchen /home-Verzeichnisen arbeitest kann es auch sein das du keine Rechte hast.
 
>Gibts bei der fehlerhaften Version das Verzeichnis überhaupt?
Ja das Verzeichnis ist vorhanden. Wenn ich über die Komandozeile mit 'cp ...' was reinkopiere funktioniertes.

>error_reporting(E_ALL | E_STRICT);
>ini_set('display_errors', 1);
Hab ich jetzt mal angeschaltet, aber an der konkreten Stelle gibt es keine Notices oder Errors...

Ich arbeite unter Unix und das Quell-Verzeichnis ist ein Home-Verzeichnis und es kopiert in das Webserver-Verzeichnis rein. Aber ich glaube nicht daß das Problem ist, weil das kopieren funktioniert ja, wenn ich die Datei in ein Verzeichnis, auf der genau gleichen Ebene, kopiere. Der einzigste Unterschied den ich entdecken konnte war das einmal das letzte Verzeichnis 'slideshow' heißt und einmal z.B. 'slide'...
 
Zuletzt bearbeitet:
Das du die Datei an der Shell kopieren kannst, ist für uns (auf jeden Fall für mich) jetzt erstmal kein Grund anzunehmen, das die Rechte ausreichend sind. Welche Rechte hat der Ordner

/home/ziel/unterverzeichnis/unterverzeichnis/slideshow/

denn überhaupt? Wem gehört der Ordner (User+Gruppe)?

Hast du darauf geachtet, das ein Verzeichnis immer das Exec-Bit in den Rechten gesetzt haben muss - sonst kann man nicht rein wechseln.
 
Hallo Saftmeister,

Die Verzeichnisse sind vollgendermaßen geflaggt, wobei das Kopieren in Inlay funktioniert, in Slideshow aber nicht.
Code:
drwxr-xr-x  2 www-data www-data  4096 2011-10-30 15:26 inlay
drwxr-xr-x  2 www-data www-data  4096 2011-10-30 18:56 slideshow

gibt es vielleicht Verzeichniss-Flags die nicht gleich sichtbar sind? Wobei ich habe auch das Verzeichniss schon gelöscht und wieder neuangelegt...
 
Ok, dann anders:

- Schau mal ins error.log des Webservers, ob da was markantes zu sehen ist.
- Gibt der copy()-Befehl true oder false zurück?
- Kannst du mal das Teil-Script posten, was den Copy erledigen soll?
- Kannst du das PHP-Script mal an der Kommando-Zeile ausführen (mit dem Befehl php -f scriptname.php)?
 
Hallo Saftmeister, erst mal danke für die bisherigen Anregungen: zu deinen Tipps:
-im ErrorLog vom Apache steht leider nix
-der Copy-Befehl gibt TRUE zürück, entspricht leider nicht der Wahrheit
-Script Posten: Mach ich unten
-über die Console ergibt das gleiche wie beim ausführen übers Web.

Anmerkung zum Script Ich hatte das ganze bisher in einer Typo3-Extension habs jetzt aber ausgelagert um mir das störungsfreier ansehen zu können. Die Dateinamen, die kopiert werden sollen, kommen aus einer XML, es handelt sich um Namen aus der Windows-Welt, dh. mit Leer- und Sonderzeichen zB. 'La Belle Hélène_Helen2.jpg'.

Die Funktion 'make_slug' macht aus dem UTF8-Name einen verträglichen Namen ohne Sonderzeichen und Leerstellen.

PHP:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

$bCodes = array('B24035','B24043','B24042','B24041','B24040','B11708','B11709','B11710','B11711','B11712');
$copy = new copyPics($bCodes,'m1077');
$copy->getAndParseMediaXML();
$copy->copyFiles();


class copyPics {
	var $xml_media_data = 'Export_DV.xml';
	var $xml_dir_absolute = '/home/data/';
	var $xml_dir;
	var $bilderDir = 'BILDER/';
	var $slideshowDir = 'slideshow/';
	var $targetRoot = '/var/www/homepage45/htdocs/fileadmin/media/';
	var $targetDir;
	var $xmlDvData;
	var $bilderArr = array();
	public function __construct($bilderCodes,$target){
		$this->xml_dir = $this->xml_dir_absolute.'XML-EXPORT_IMPORT/';
		$this->bilderArr = $bilderCodes;
		$this->targetDir = $target.'/';
	}		
	public function  getAndParseMediaXML(){
		$aMedia = array();
		if (!is_file($this->xml_dir.$this->xml_media_data)){
			$this->msg.= "Konnte die Daten-XML $this->xml_media_data nicht finden <br />";
			return FALSE;
		}
		$file = file($this->xml_dir.$this->xml_media_data) or die ('Konnte '.$this->xml_dir.$this->xml_media_data.' nicht finden');
		//Die erste Zeile entfernenen
		$muell = array_shift($file);
		$file = implode('\n',$file);
		$xml = new SimpleXMLElement($file);
		foreach ($xml->DATEIVerwaltung as $single_row){
			$key = $single_row->DateiNr.'';

			foreach ($single_row->children() as $name => $value){
				$aMedia[$key][$name] = $value.'';	
			}
		}
		$this->xmlDvData = $aMedia;
		
	}
	
	public function copyFiles(){
		print_r($this->xmlDvData);
		$targetPath = $this->targetRoot.$this->targetDir.$this->slideshowDir;
	
		foreach ($this->bilderArr as $singlePic) {
			if (array_key_exists($singlePic, $this->xmlDvData)){
				if (!($this->xmlDvData[$singlePic]['AKTUELL']=='J')){
					continue;
				}
	
				$sourceFile = utf8_decode($this->xmlDvData[$singlePic]['DateiName']);
				if (!is_file($this->xml_dir_absolute.$this->bilderDir.$sourceFile)){
					echo $this->xml_dir_absolute.$this->bilderDir.$sourceFile." existiert nicht. <br />";
					continue;
				}
				$file_name_new = ax_helper::make_slug($sourceFile,$targetPath,TRUE);
				$target = $targetPath.$file_name_new;
				$source = $this->xml_dir_absolute.$this->bilderDir.$sourceFile;
				$ok = copy($source, $target);
				echo 'ok :'.$ok .'<br>';
			}
		}
	}
	
}
 
Hmm,

ich kann keinen offensichtlichen Fehler erkennen. Wenn du dir sicher bist, das make_slug() immer das korrekte zurück gibt (eine Prüfung sehe ich hier nicht), sollte das eigentlich funktionieren. Sicherheitshalber kannst du ja noch mal eine Prüfung vor das copy() bauen:

PHP:
                if( file_exists($target) )
                    echo "$target existiert bereits und wird ohne Rückfrage überschrieben.<br/>";
                else
                    echo "Kopiere nach $target<br/>";
                $ok = copy($source, $target);

Wenn das auch keine Erkenntnisse bringt, habe ich nur noch eine Idee, wie man raus bekommen könnte, was da schief geht: strace.
 
Zurück