2016-08-24 88 views
2

進入我的服務器我有一個獨特的upload文件夾中有成千上萬的圖像,所以我想通過使用子文件夾重新整理它們,如../uploads/img/year/month/filename如何根據PHP中的上次修改日期創建文件夾?

對於所有新圖像上傳我使用這段代碼爲我的作品:

$path = __DIR__ .'/../uploads/img/' . date("Y") . '/' . date("m") . '/' . $filename; 

if (!is_dir($path)) { 
    mkdir($path, 0775, true); 
} 

我如何能爲我的所有文件在同一已經上傳的文件夾,使新的目錄和排序所有文件的最後修改日期?

例如,

filename | last modified date 
------ | ------ 
1.jpg | 24/02/2016 
2.jpg | 24/04/2016 
3.jpg | 24/06/2016 
4.jpg | 20/08/2016 
5.jpg | 24/08/2016 

目標:

../uploads/img/2016/02/1.jpg 
../uploads/img/2016/04/2.jpg 
../uploads/img/2016/06/3.jpg 
../uploads/img/2016/08/4.jpg 
         /5.jpg 

我嘗試

function grab_pictures() { 
    $mpath = __DIR__ .'/../uploads/media'; 

    foreach (glob("$mpath/*") as $file) { 
     $lastmoddate = filemtime($file); 
     $basename = basename($file);  
     $month = date("m", filemtime($lastmoddate)); 
     $year = date("Y", filemtime($lastmoddate)); 
     $newPath = __DIR__ .'/../uploads/media/' .$year. '/' .$month. '/'; 

     if (!is_dir($newPath)) { 
      mkdir($newPath, 0775, true); 
     } 

     $newName = '/' .$year. '/' .$month. '/' .$basename; 

     $this->db->query(sprintf("UPDATE `images` SET `path` = '%s', `time` = `time`", $newName)); 

     // Move the file into the uploaded folder 
     move_uploaded_file($basename, $newPath); 
    } 

} 

但它不工作,沒有文件已經被移動,只有一個文件夾的創建(1970至01年)

解決方案

function grab_pictures() { 
    $mpath = __DIR__ .'/../uploads/media'; 

    foreach (glob("$mpath/*") as $file) { 
     if(!is_dir($file)){ 
     $lastmoddate = filemtime($file); 
     $basename = basename($file);  
     $month = date("m", $lastmoddate); 
     $year = date("Y", $lastmoddate); 
     $newPath = __DIR__ .'/../uploads/media/' .$year. '/' .$month. '/'; 

     if (!is_dir($newPath)) { 
      mkdir($newPath, 0775, true); 
     } 

     $newName = '/' .$year. '/' .$month. '/' .$basename; 

     $old_Path = $mpath. '/' .$basename; 
     $new_Path = $mpath.$newName; 

     $this->db->query(sprintf("UPDATE `tracks` SET `art` = '%s', `time` = `time` WHERE `art` = '%s'", $newName,$basename)); 

     // Move the file 
     rename($old_Path, $new_Path); 
     } 
    } 

} 
+1

'$ path = __DIR__。'/ ../uploads/img /'。日期(「Y」)。 '/'。日期(「m」)。 '/'。 $ filename;'*或許?* –

+0

@ Fred-ii-謝謝,但並不那麼簡單。我的問題是我不知道如何對已經存在於服務器中的文件執行相同的操作。 – ilvalentino4ever

+0

不知道你是否可以這樣做... – Tonza

回答

1

您可以嘗試在PHP中提供的filemtime(filename)功能。它返回您可以使用日期功能的時間戳
嘗試echo date("m d Y", filemtime(filename))

在for循環中通過所有文件運行filemtime函數。這可能是循環的流程。

  1. 檢查的最後修改日期(filemtime(文件名))
  2. 儲存於一個變量(如mdate)
  3. 檢查,如果一個文件夾的日期(mdate)存在
  4. 如果不是,創建一個文件夾(使用$ path變量)
  5. 將文件移動到新文件夾
  6. 對於將來上傳的所有文件,也使用此循環。

查看下面的代碼片段。這可能只是你想要的。

foreach (glob("$parent_folder/*") as $file) { 
$lastmoddate = filemtime("$file"); 
... folder creation/checking and file moving stuff ... 
} 

我希望它有助於清除一些東西。 檢查這個reference page for the usage of filemtime()

+0

爲什麼使用'$ parent_folder'和'$ folder'? – ilvalentino4ever

+0

請看看我的嘗試,有什麼不對? – ilvalentino4ever

+1

@ ilvalentino4ever在您的「我的嘗試」中,您使用的是'date(「m」,filemtime($ lastmoddate))' '$ lastmoddate是文件修改日期的時間戳。 您不需要在$ lastmoddate上再次運行filemtime。 只需使用'日期(「M」,$ LASTMODDATE)' 讓我知道,如果它仍然拋出錯誤:) –

相關問題