Workermanドキュメントにファイル転送機能を実装する

王林
リリース: 2023-11-08 15:39:16
オリジナル
1246 人が閲覧しました

Workermanドキュメントにファイル転送機能を実装する

Workerman は、PHP をベースに開発された高性能な非同期イベント駆動型フレームワークで、TCP/UDP プロトコルでの長時間接続の開発を簡単に実現できます。さらに、Workerman はファイル転送を実現する機能も提供しており、大規模なファイル転送やデータのバックアップなどのシナリオで使用できます。この記事では、Workerman にファイル転送機能を実装する方法と具体的なコード例を紹介します。

1. ファイルアップロード機能の実装

ファイルアップロード機能では、クライアントがアップロードするファイルをサーバーに送信する必要があり、サーバーはファイルを検証して保存します。 Workerman では、workerman/file-transfer コンポーネントを使用してファイル アップロード機能を実装できます。具体的なプロセスは次のとおりです。

  1. クライアントはファイルを zip ファイルにパッケージ化し、サーバーに送信します。
$ftp = new Ftp($server_ip, $server_port);
$ftp->connect();
$response = $ftp->send($zip_file_path);
ログイン後にコピー

ここでは、クライアントによってパッケージ化された zip ファイルをサーバーに送信するために FTP コンポーネントが使用されています。

  1. サーバーはファイル形式を検証し、解凍します。
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");
    }
}
ログイン後にコピー

サーバーは、workerman/file-transfer コンポーネントを通じてクライアントからファイル データを受信し、zip ファイルとして保存します。次に、ZipArchive ライブラリを使用してファイルを解凍し、解凍されたファイルを指定したディレクトリに保存します。解凍に失敗した場合は、失敗情報がクライアントに送信されます。

2. ファイルダウンロード機能の実装

ファイルダウンロード機能では、クライアントがサーバーにファイルを要求し、サーバーから応答されたファイルデータをローカルファイルとして保存する必要があります。 Workerman では、PHP の fopen() 関数を使用して、ローカル ファイル接続とサーバー側のファイル接続を開き、サーバーから返されたファイル データをローカル ファイルに書き込むことができます。具体的なプロセスは次のとおりです。

  1. クライアントは、サーバーへのファイルのダウンロード要求を開始します。
$client->send(json_encode([
    'type' => 'download',
    'filename' => $filename,
]));
ログイン後にコピー

クライアントは、ダウンロードするファイルの名前を含むメッセージをサーバーに送信します。

  1. サーバーはクライアントのリクエストを受信し、ファイル データをストリーミング形式で送信します。
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);
}
ログイン後にコピー

サーバーはクライアントのリクエストを受信すると、まずファイルが存在するかどうかを判断します。ファイルが存在しない場合は、失敗メッセージがクライアントに返されます。ファイルが存在する場合、fopen() 関数を使用してファイル接続が開かれ、ファイルの合計サイズが計算されます。次に、合計ファイル サイズ情報をクライアントに送信します。その後、ファイルの内容は while ループを通じてクライアントに複数回送信されます。

  1. クライアントはサーバーからファイル データを受信し、ローカル ファイルとして保存します。
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);
}
ログイン後にコピー

クライアントは、サーバーから合計ファイル サイズを受信した後、ループを使用してサーバーから送信されたファイル データを受信し、ローカル ファイルとして保存します。

要約すると、workerman/ファイル転送コンポーネントと PHP の fopen() 関数を使用することで、Workerman にファイルのアップロードおよびダウンロード機能を簡単に実装できます。大きなファイルをアップロードする場合、ユーザーエクスペリエンスを向上させるために、アップロード進行状況バーや分割送信などの機能を追加する必要があることに注意してください。

以上がWorkermanドキュメントにファイル転送機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!