2012-11-14 11 views
39

私はウェブサイトから多くの画像をアップロードしており、より良い方法でファイルを整理する必要があります。 したがって、私は数か月でフォルダを作成することにしました。file_put_contents()を実行したときにフォルダを作成する

$month = date('Yd') 
file_put_contents("upload/promotions/".$month."/".$image, $contents_data); 

これを試した後、エラーが発生します。

メッセージ:ますfile_put_contentsは(アップロード/プロモーション/ 201211/ang232.png):ストリームをオープンに失敗しましたありません:そのようなファイルやディレクトリ

んが

Iが存在するフォルダ内のファイルだけを入れてみました場合は、それが働きました。ただし、新しいフォルダを作成できませんでした。

この問題を解決する方法はありますか?

答えて

97

file_put_contents()は、ディレクトリ構造を作成しません。ファイルのみ。

ディレクトリが存在するかどうかをテストするには、スクリプトにロジックを追加する必要があります。そうでない場合は、最初に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); 

更新:mkdir()どの欠落しているディレクトリ構造を作成します$recursiveの三番目のパラメータを受け付けます。複数のディレクトリを作成する必要がある場合に便利です。再帰的なディレクトリ777に設定されたアクセス権を持つ

例:上記の回答の

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

素晴らしいです!ありがとうございました! – Jake

5

変更が

(自動的に検出し、システム上の任意のファイル名からフォルダを作成スラッシュ)、それはもう少し一般的な作るためにps以前の回答は素晴らしいです

/** 
* 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

絶対に不要です...ディレクトリが存在するかどうかだけを確認できます。 'mkdir($ fileDestinationDir、0777、true);'を呼び出さなければ。そして 'file_put_contents'を呼び出します。 * NIXシステムではディレクトリの区切り文字として '/'を使用していますが、Windowsでは気にせず、 'mkdir( '/ path/with/forward/slashes')'を何も問題なく実行できます。 –

+0

cool、good points、再帰フラグを追加 – aqm

-3

私はあなたが好きかもしれない機能を書いています。これはforceDir()と呼ばれます。基本的に、あなたが望むディレクトリが存在するかどうかをチェックします。もしそうなら、それは何もしません。そうでなければ、ディレクトリを作成します。 mkdirの代わりにこの関数を使用する理由は、この関数が次のフォルダも作成できることです。たとえば、( 'upload/promotions/januari/firstHalfOfTheMonth')です。目的のdir_pathにパスを追加するだけです。

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

mkdir()の3番目のパラメータとして 'true'を追加することもできます。 – rjmunro

関連する問題