Permintaan umum adalah untuk dapat menghasilkan daftar beberapa atau semua file dalam direktori - mirip dengan halaman indeks default yang disediakan oleh sebagian besar server web, tetapi dengan kontrol lebih besar atas konten dan pemformatan
Tujuan lain mungkin untuk mengambil beberapa tindakan pada file menggunakan PHP. Dalam kedua kasus, langkah pertama adalah meminta sistem file untuk mengembalikan daftar direktori dan file
Fungsi yang disajikan di bawah menyediakan sarana untuk mengekstrak nama file dan properti lainnya dari satu direktori, atau menjelajahi subdirektori secara rekursif
PHP 5 memperkenalkan fungsi scandir yang akan "Mencantumkan file dan direktori di dalam jalur yang ditentukan" tetapi tidak akan muncul kembali atau memberikan informasi tambahan tentang file yang terdaftar
Jika Anda menggunakan PHP 5 atau lebih tinggi, lihat artikel baru kami tentang Daftar Direktori menggunakan kelas SPL untuk pendekatan yang jauh lebih rapi, dan kelas FileList PHP baru kami
Daftar Direktori Tunggal
Untuk memulai, berikut adalah fungsi sederhana yang mengembalikan daftar file, direktori, dan propertinya dari satu direktori (versi lebih lanjut dari fungsi ini dapat ditemukan lebih jauh di bawah halaman)
// array to hold return value $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 0, 'lastmod' => filemtime("{$dir}{$entry}") ]; } elseif(is_readable("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>Anda dapat menggunakan fungsi ini sebagai berikut
// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_Variabel $_SERVER['DOCUMENT_ROOT'] harus diselesaikan ke direktori root situs web Anda. e. g. /var/www/public_html
Nilai yang dikembalikan adalah larik asosiatif file termasuk jalur file, jenis, ukuran, dan tanggal modifikasi terakhir, kecuali jika file sebenarnya adalah direktori, dalam hal ini string "(dir)" akan muncul alih-alih ukuran file. Nama file mengambil batang yang sama dengan pemanggilan fungsi
Contoh 1
",print_r($dirlist),""; /* sample output Array ( [0] => Array ( [name] => images/background0.jpg [type] => image/jpeg [size] => 86920 [lastmod] => 1077461701 ) [1] => .. ) */ ?>Contoh 2
",print_r($dirlist),""; /* sample output Array ( [0] => Array ( [name] => ./images/background0.jpg [type] => image/jpeg [size] => 86920 [lastmod] => 1077461701 ) [1] => .. ) */ ?>Jika Anda ingin output diurutkan berdasarkan satu atau beberapa bidang, Anda harus membaca artikel tentang Menyortir Array dari Array atau mencoba salah satu Algoritma Penyortiran DHTML kami menggunakan JavaScript
Kami juga memiliki artikel tentang Daftar Direktori menggunakan kelas SPL (DirectoryIterator dan SplFileInfo) yang memperkenalkan banyak opsi baru untuk memfilter dan menyortir keluaran
Menampilkan Daftar File dalam HTML
Untuk menampilkan hasil ke halaman HTML, kami hanya mengulangi array yang dikembalikan
// output file list in HTML TABLE format echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; foreach($dirlist as $file) { echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } echo "\n"; echo "NameTypeSizeLast Modified{$file['name']}{$file['type']}{$file['size']}",date('r', $file['lastmod']),"\n\n"; ?>_Kode ini dapat dengan mudah dimodifikasi. jadikan output sebagai daftar, bukan tabel;
Tampilkan gambar PNG dalam TABEL
Misalnya, untuk hanya menampilkan file PNG, tambahkan saja kondisi ke loop keluaran
Di sini Anda dapat melihat kode sumber lengkap untuk contoh ini
Ini akan memiliki efek melewatkan semua file yang namanya tidak diakhiri dengan. png. Anda juga dapat menerapkan ketentuan berdasarkan jenis file, ukuran, atau stempel waktu terakhir yang dimodifikasi
Buat daftar file PDF dengan tautan
Satu contoh terakhir, hanya mencantumkan file PDF dan menautkan nama file ke file tersebut
// output file list as table rows foreach($dirlist as $file) { if($file['type'] != 'application/pdf') { continue; } echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; } ?>NameTypeSizeLast Modified",basename($file['name']),"{$file['type']}{$file['size']}",date('r', $file['lastmod']),"_Di sini Anda dapat melihat kode sumber lengkap untuk contoh ini
Jika Anda ingin menampilkan, misalnya, thumbnail sebagai tautan ke gambar yang lebih besar, atau bahkan video, berikan saja kedua file itu nama yang sama dan dalam skrip di atas gunakan str_replace atau fungsi serupa untuk memodifikasi tautan href atau . Lihat artikel kami tentang daftar gambar untuk contoh
Dengan menggunakan kelas SPL DirectoryIterator dan FilterIterator, kita sekarang dapat menentukan pola yang cocok saat mengakses daftar file sehingga hanya file yang cocok yang dikembalikan. Lebih lanjut tentang itu di sini
Daftar Direktori Rekursif
Sekarang kita sudah sampai sejauh ini, itu hanya perubahan kecil untuk memperluas fungsi untuk mendaftar subdirektori secara rekursif. Dengan menambahkan parameter kedua ke fungsi, kami juga mempertahankan fungsi sebelumnya untuk mendaftar satu direktori
// Original PHP code by Chirp Internet: www.chirpinternet.eu // Please acknowledge use of this code by including this header. function getFileList($dir, $recurse = FALSE) { $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 0, 'lastmod' => filemtime("{$dir}{$entry}") ]; if($recurse && is_readable("{$dir}{$entry}/")) { $retval = array_merge($retval, getFileList("{$dir}{$entry}/", TRUE)); } } elseif(is_readable("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>Untuk memanfaatkan fungsionalitas baru, Anda harus memberikan nilai TRUE (atau 1) sebagai parameter kedua
Sebelum mengulang skrip terlebih dahulu periksa apakah sub-direktori dapat dibaca, dan jika tidak pindah ke item berikutnya untuk menghindari kesalahan izin
Seperti sebelumnya, nilai yang dikembalikan adalah larik dari larik asosiatif. Faktanya satu-satunya perubahan adalah Anda memiliki opsi tambahan untuk daftar rekursif
Rekursi Kedalaman Terbatas
Contoh terakhir ini menambahkan fitur lain - kemampuan untuk menentukan seberapa dalam rekursi yang Anda inginkan. Kode sebelumnya akan terus menjelajahi direktori hingga kehabisan tempat untuk dituju. Dengan skrip ini Anda dapat mengatakannya untuk tidak masuk lebih dalam dari jumlah level yang tetap dalam sistem file
// Original PHP code by Chirp Internet: www.chirpinternet.eu // Please acknowledge use of this code by including this header. function getFileList($dir, $recurse = FALSE, $depth = FALSE) { $retval = []; // add trailing slash if missing if(substr($dir, -1) != "/") { $dir .= "/"; } // open pointer to directory and read list of files $d = @dir($dir) or die("getFileList: Failed opening directory {$dir} for reading"); while(FALSE !== ($entry = $d->read())) { // skip hidden files if($entry{0} == ".") continue; if(is_dir("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}/", 'type' => filetype("{$dir}{$entry}"), 'size' => 0, 'lastmod' => filemtime("{$dir}{$entry}") ]; if($recurse && is_readable("{$dir}{$entry}/")) { if($depth === FALSE) { $retval = array_merge($retval, getFileList("{$dir}{$entry}/", TRUE)); } elseif($depth > 0) { $retval = array_merge($retval, getFileList("{$dir}{$entry}/", TRUE, $depth-1)); } } } elseif(is_readable("{$dir}{$entry}")) { $retval[] = [ 'name' => "{$dir}{$entry}", 'type' => mime_content_type("{$dir}{$entry}"), 'size' => filesize("{$dir}{$entry}"), 'lastmod' => filemtime("{$dir}{$entry}") ]; } } $d->close(); return $retval; } ?>_Seperti sebelumnya kita telah menambahkan satu parameter baru dan beberapa baris kode. Nilai default parameter kedalaman, jika tidak ditentukan dalam pemanggilan fungsi, disetel ke FALSE. Hal ini memastikan bahwa semua fitur sebelumnya tetap ada dan kode lama apa pun tidak akan rusak saat fungsinya diubah
Dengan kata lain, kita sekarang dapat memanggil fungsi getFileList dengan satu, dua atau tiga parameter
// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_0Ini adalah contoh yang bagus tentang bagaimana suatu fungsi dapat berkembang dari waktu ke waktu tanpa menjadi tidak dapat dikelola. Terlalu sering Anda melihat fungsi yang dulu berguna menjadi tidak dapat digunakan karena parameter membengkak
Fileinfo menggantikan mime_content_type
Fungsi mime_content_type telah ditinggalkan dalam versi PHP terbaru dan diganti dengan ekstensi Fileinfo PECL tidak pernah benar-benar ditinggalkan, meskipun pengumuman sebaliknya
Jika Anda melihat kesalahan dalam program Anda karena ini, tambalan berikut akan berfungsi
// list files in the current directory $dirlist = getFileList("."); $dirlist = getFileList("./"); // a subdirectory of the current directory called images $dirlist = getFileList("images"); $dirlist = getFileList("images/"); $dirlist = getFileList("./images"); $dirlist = getFileList("./images/"); // using an absolute path $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images"); $dirlist = getFileList("{$_SERVER['DOCUMENT_ROOT']}/images/"); ?>_1Ini adalah fungsi yang sama seperti yang terlihat di bagian atas halaman, hanya dengan mencentang fungsi mime_content_type yang disisipkan di bagian atas untuk menentukan metode mana yang kita gunakan untuk mendapatkan tipe file
Jika Anda memindai sistem direktori yang kompleks, Anda mungkin ingin mendeklarasikan $finfo sebagai variabel global untuk menghindari keharusan membuat ulang ketika fungsi berulang