2012-11-14 23 views
39

Ich habe viele Bilder von der Website hochgeladen und muss Dateien besser organisieren. Daher entscheide ich mich, einen Ordner nach Monaten zu erstellen.Erstellen eines Ordners beim Ausführen von file_put_contents()

nachdem ich dieses versucht habe, erhalte ich Fehlerresultat.

Nachricht: file_put_contents (upload/Promotions/201211/ang232.png): failed to open stream: No such file or directory

Wenn ich nur Datei in exist Ordner abzulegen versucht, es funktionierte . Es konnte jedoch kein neuer Ordner erstellt werden.

Gibt es eine Möglichkeit, dieses Problem zu lösen?

Antwort

97

file_put_contents() erstellt nicht die Verzeichnisstruktur. Nur die Datei.

Sie müssen Ihrem Skript Logik hinzufügen, um zu testen, ob das Verzeichnis Monat existiert. Wenn nicht, verwenden Sie zuerst mkdir().

if (!is_dir('upload/promotions/' . $month)) { 
    // dir doesn't exist, make it 
    mkdir('upload/promotions/' . $month); 
} 

file_put_contents('upload/promotions/' . $month . '/' . $image, $contents_data); 

Update:mkdir() nimmt einen dritten Parameter von $recursive die jede fehlende Verzeichnisstruktur schaffen. Kann nützlich sein, wenn Sie mehrere Verzeichnisse erstellen müssen.

Beispiel mit rekursiven und Verzeichnisberechtigungen auf 777:

mkdir('upload/promotions/' . $month, 0777, true); 
+1

genial! Vielen Dank! – Jake

5

Modifikation von oben Antwort, um es ein bisschen mehr Generika, (erkennt automatisch und erstellt einen Ordner aus beliebigen Dateinamen auf System schlitzt)

ps vorherige Antwort ist genial

/** 
* create file with content, and create folder structure if doesn't exist 
* @param String $filepath 
* @param String $message 
*/ 
function forceFilePutContents ($filepath, $message){ 
    try { 
     $isInFolder = preg_match("/^(.*)\/([^\/]+)$/", $filepath, $filepathMatches); 
     if($isInFolder) { 
      $folderName = $filepathMatches[1]; 
      $fileName = $filepathMatches[2]; 
      if (!is_dir($folderName)) { 
       mkdir($folderName, 0777, true); 
      } 
     } 
     file_put_contents($filepath, $message); 
    } catch (Exception $e) { 
     echo "ERR: error writing '$message' to '$filepath', ". $e->getMessage(); 
    } 
} 
+2

Absolut unnötig ... Sie könnten einfach überprüfen, ob ein Verzeichnis existiert. Wenn nicht, rufen Sie 'mkdir ($ fileDestinationDir, 0777, true) auf;'. Und dann rufen Sie 'file_put_contents' auf. Während * NIX-Systeme '/' als Verzeichnistrennzeichen verwenden, ist Windows egal und Sie können 'mkdir ('/ Pfad/mit/Vorwärts/Schrägstriche')' ohne irgendwelche Probleme machen. –

+0

cool, gute Punkte, Hinzufügen der Rekursion Flag – aqm

-3

Ich schrieb eine Funktion, die Sie mögen könnten. Es heißt forceDir(). Es prüft grundsätzlich, ob das gewünschte Verzeichnis existiert. Wenn ja, tut es nichts. Wenn nicht, wird das Verzeichnis erstellt. Ein Grund, diese Funktion anstelle von nur mkdir zu verwenden, ist, dass diese Funktion auch verknüpfte Ordner erstellen kann. Zum Beispiel ('upload/promotions/januari/firstHalfOfTheMonth'). Fügen Sie einfach den Pfad zum gewünschten Verzeichnispfad hinzu.

function forceDir($dir){ 
    if(!is_dir($dir)){ 
     $dir_p = explode('/',$dir); 
     for($a = 1 ; $a <= count($dir_p) ; $a++){ 
      @mkdir(implode('/',array_slice($dir_p,0,$a))); 
     } 
    } 
} 
+3

Sie können auch nur 'true' als dritter Parameter zu mkdir() hinzufügen. – rjmunro

Verwandte Themen