Maison  >  Article  >  cadre php  >  Implémenter la fonction de transfert de fichiers dans les documents Workerman

Implémenter la fonction de transfert de fichiers dans les documents Workerman

王林
王林original
2023-11-08 15:39:161240parcourir

Implémenter la fonction de transfert de fichiers dans les documents Workerman

Workerman est un framework événementiel asynchrone hautes performances développé sur la base de PHP, qui peut facilement réaliser le développement de connexions longues sous le protocole TCP/UDP. De plus, Workerman fournit également la fonction de réalisation de transfert de fichiers, qui peut être utilisée dans des scénarios tels que le transfert de fichiers volumineux et la sauvegarde de données. Cet article explique comment implémenter la fonction de transfert de fichiers dans Workerman et fournit des exemples de code spécifiques.

1. Implémentation de la fonction de téléchargement de fichiers

La fonction de téléchargement de fichiers nécessite que le client envoie le fichier à télécharger au serveur, et le serveur vérifie et enregistre le fichier. Dans Workerman, la fonction de téléchargement de fichiers peut être implémentée à l'aide du composant Workerman/file-transfer. Le processus spécifique est le suivant :

  1. Le client regroupe le fichier dans un fichier zip et l'envoie au serveur.
$ftp = new Ftp($server_ip, $server_port);
$ftp->connect();
$response = $ftp->send($zip_file_path);

Le composant FTP est utilisé ici pour envoyer le fichier zip packagé par le client vers le serveur.

  1. Le serveur vérifie le format du fichier et le décompresse.
public static function handle($connection, $data)
{
    $zip_file = 'upload_file.zip';
    file_put_contents($zip_file, $data);
    $zip = new ZipArchive();
    if ($zip->open($zip_file) === TRUE) {
        $zip->extractTo('./unzip_file/');
        $zip->close();
        unlink($zip_file);
    } else {
        $connection->send("unzip failed");
    }
}

Le serveur reçoit les données du fichier du client via le composant workerman/file-transfer et les enregistre sous forme de fichier zip. Utilisez ensuite la bibliothèque ZipArchive pour décompresser le fichier et enregistrez le fichier décompressé dans le répertoire spécifié. Si la décompression échoue, les informations d'échec sont envoyées au client.

2. Implémentation de la fonction de téléchargement de fichiers

La fonction de téléchargement de fichiers nécessite que le client demande un fichier au serveur et enregistre les données du fichier répondues par le serveur en tant que fichier local. Dans Workerman, vous pouvez utiliser la fonction fopen() de PHP pour ouvrir la connexion de fichier local et la connexion de fichier côté serveur, et écrire les données de fichier renvoyées par le serveur dans le fichier local. Le processus spécifique est le suivant :

  1. Le client initie une demande de téléchargement de fichier vers le serveur.
$client->send(json_encode([
    'type' => 'download',
    'filename' => $filename,
]));

Le client envoie un message au serveur, portant le nom du fichier à télécharger.

  1. Le serveur reçoit la demande du client et envoie les données du fichier en streaming.
public static function handle($connection, $data)
{
    $data = json_decode($data, true);
    $filename = $data['filename'];
    if (!file_exists($filename)) {
        $connection->send(json_encode(['code' => -1, 'msg' => 'file not exist']));
        return;
    }
    $fp = fopen($filename, 'rb');
    $total = filesize($filename);
    $connection->send(json_encode(['code' => 0, 'msg' => 'filesize', 'data' => ['size' => $total]]));
    while (!feof($fp)) {
        $connection->send(fread($fp, 8192), true);
    }
    fclose($fp);
}

Après avoir reçu la demande du client, le serveur détermine d'abord si le fichier existe. Si le fichier n'existe pas, un message d'échec est renvoyé au client. Si le fichier existe, la connexion au fichier est ouverte à l'aide de la fonction fopen() et la taille totale du fichier est calculée. Envoyez ensuite les informations sur la taille totale du fichier au client. Par la suite, le contenu du fichier est envoyé plusieurs fois au client via une boucle while.

  1. Le client reçoit les données du fichier du serveur et les enregistre en tant que fichier local.
public function download($client, $response)
{
    $this->downloadSize = 0;
    $this->downloadTotal = $response['data']['size'];
    $data = json_encode(['type' => 'download_continue']);
    while ($this->downloadSize < $this->downloadTotal) {
        $client->send($data);
    }
    fclose($fp);
}

Une fois que le client a reçu la taille totale du fichier du serveur, il utilise une boucle pour recevoir les données du fichier envoyées par le serveur et les enregistre en tant que fichier local.

En résumé, en utilisant le composant workman/file-transfer et la fonction fopen() de PHP, nous pouvons facilement implémenter les fonctions de téléchargement et de téléchargement de fichiers dans Workerman. Il convient de noter que lors du téléchargement de fichiers volumineux, des fonctions telles que la barre de progression du téléchargement ou la transmission segmentée doivent être ajoutées pour améliorer l'expérience utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn