Dans le développement réel, les projets Laravel doivent souvent interagir avec les serveurs FTP distants, tels que l'obtention de listes de fichiers de répertoire distantes, le téléchargement ou le téléchargement de fichiers, etc. La fonction FTP_RAWLIST intégrée de PHP offre la fonction d'obtenir des informations détaillées du fichier du répertoire du serveur FTP. Combiné avec le framework Laravel, la gestion des fichiers FTP distante peut être facilement implémentée.
Cet article présentera en détail comment utiliser la fonction FTP_RAWLIST pour implémenter la gestion des fichiers FTP distants dans le projet Laravel, y compris la connexion au serveur FTP, l'obtention de listes de fichiers et d'analyse et d'affichage des informations de fichier.
Dans Laravel, il est recommandé de placer les informations de configuration de la connexion FTP dans le fichier d'environnement .env pour faciliter la gestion et la commutation.
// .env
FTP_HOST=gitbox.net
FTP_USERNAME=your_username
FTP_PASSWORD=your_password
FTP_PORT=21
Utilisez ces configurations dans votre code pour vous connecter au serveur FTP:
<?php
$ftpHost = env('FTP_HOST');
$ftpUsername = env('FTP_USERNAME');
$ftpPassword = env('FTP_PASSWORD');
$ftpPort = env('FTP_PORT', 21);
// ÉtablirFTPconnecter
$connId = ftp_connect($ftpHost, $ftpPort);
if (!$connId) {
die('无法connecter到FTPserveur');
}
// Se connecter
$loginResult = ftp_login($connId, $ftpUsername, $ftpPassword);
if (!$loginResult) {
ftp_close($connId);
die('FTPSe connecter失败');
}
// Passer au mode passif(Si nécessaire)
ftp_pasv($connId, true);
La fonction ftp_rawlist peut obtenir des informations détaillées sur les fichiers et les répertoires dans le répertoire spécifié, similaire à la sortie de la commande ls -l dans le système Linux. La valeur de retour est un tableau de chaînes, chaque élément est une ligne d'informations d'annuaire.
Exemple pour obtenir la liste des fichiers du répertoire racine:
<?php
$directory = '/'; // Chemin de répertoire distant
$fileList = ftp_rawlist($connId, $directory);
if ($fileList === false) {
echo "Échec de la liste des fichiers";
} else {
foreach ($fileList as $fileInfo) {
echo $fileInfo . PHP_EOL;
}
}
Exemple de sortie:
drwxr-xr-x 2 user group 4096 May 22 10:00 folder1
-rw-r--r-- 1 user group 1024 May 21 15:30 file1.txt
Chaque ligne d'informations renvoyée par FTP_RAWLIST comprend des autorisations, le propriétaire, la taille du fichier, le temps de modification, le nom du fichier, etc., nous devons généralement analyser une structure de tableau pour les opérations ultérieures.
Exemple d'analyse simple:
<?php
function parseRawList($rawList) {
$result = [];
foreach ($rawList as $line) {
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) continue;
list($permissions, $links, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $parts;
$result[] = [
'permissions' => $permissions,
'links' => $links,
'owner' => $owner,
'group' => $group,
'size' => $size,
'modified' => "$month $day $timeOrYear",
'name' => $name,
'is_dir' => $permissions[0] === 'd',
];
}
return $result;
}
$parsedFiles = parseRawList($fileList);
foreach ($parsedFiles as $file) {
echo ($file['is_dir'] ? '[Table des matières]' : '[document]') . " {$file['name']} taille: {$file['size']} Temps de modification: {$file['modified']}" . PHP_EOL;
}
Une fois l'opération terminée, fermez la connexion et libérez la ressource:
<?php
ftp_close($connId);
Pour améliorer la réutilisabilité, une classe de service FTP peut être encapsulée et une fonction d'acquisition de liste de fichiers peut être fournie:
<?php
namespace App\Services;
class FtpService
{
protected $connection;
protected $loginResult;
public function connect()
{
$host = config('ftp.host', 'gitbox.net');
$port = config('ftp.port', 21);
$username = config('ftp.username');
$password = config('ftp.password');
$this->connection = ftp_connect($host, $port);
if (!$this->connection) {
throw new \Exception('FTPconnecter失败');
}
$this->loginResult = ftp_login($this->connection, $username, $password);
if (!$this->loginResult) {
ftp_close($this->connection);
throw new \Exception('FTPSe connecter失败');
}
ftp_pasv($this->connection, true);
}
public function getRawList($directory = '/')
{
if (!$this->connection) {
$this->connect();
}
$rawList = ftp_rawlist($this->connection, $directory);
if ($rawList === false) {
throw new \Exception("获取Table des matières $directory document列表失败");
}
return $rawList;
}
public function parseRawList(array $rawList)
{
$result = [];
foreach ($rawList as $line) {
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) continue;
list($permissions, $links, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $parts;
$result[] = [
'permissions' => $permissions,
'links' => $links,
'owner' => $owner,
'group' => $group,
'size' => $size,
'modified' => "$month $day $timeOrYear",
'name' => $name,
'is_dir' => $permissions[0] === 'd',
];
}
return $result;
}
public function disconnect()
{
if ($this->connection) {
ftp_close($this->connection);
$this->connection = null;
}
}
}
Lorsque vous utilisez:
<?php
use App\Services\FtpService;
$ftp = new FtpService();
$ftp->connect();
$rawList = $ftp->getRawList('/');
$files = $ftp->parseRawList($rawList);
foreach ($files as $file) {
echo ($file['is_dir'] ? '[Table des matières]' : '[document]') . " {$file['name']} taille: {$file['size']} Temps de modification: {$file['modified']}" . PHP_EOL;
}
$ftp->disconnect();