74

Web サイトから大量の画像をアップロードしましたが、ファイルをより適切に整理する必要があります。そのため、月ごとにフォルダを作成することにしました。

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

これを試した後、エラー結果が表​​示されます。

メッセージ: file_put_contents(upload/promotions/201211/ang232.png): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません

既存のフォルダーにファイルだけを入れようとすると、うまくいきました。ただし、新しいフォルダーの作成に失敗しました。

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

4

6 に答える 6

163

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

monthディレクトリが存在するかどうかをテストするには、スクリプトにロジックを追加する必要があります。そうでない場合は、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()3 番目のパラメーターを受け入れます。複数のディレクトリを作成する必要がある場合に便利です。$recursive

再帰的およびディレクトリ権限が 777 に設定されている例:

mkdir('upload/promotions/' . $month, 0777, true);
于 2012-11-14T02:30:38.257 に答える
-4

あなたが好きかもしれない関数を書きました。これは 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)));  
        }
    }
}
于 2014-03-25T09:17:42.040 に答える