ホームページ  >  記事  >  バックエンド開発  >  CakePHP ミドルウェア: ファイルのアップロードおよびダウンロード機能を実装します。

CakePHP ミドルウェア: ファイルのアップロードおよびダウンロード機能を実装します。

王林
王林オリジナル
2023-07-30 15:09:251473ブラウズ

CakePHP ミドルウェア: ファイルのアップロードおよびダウンロード機能の実装

インターネットの発展に伴い、ファイルのアップロードおよびダウンロード機能はますます一般的になってきています。 Web アプリケーションを開発する場合、ファイルのアップロードとダウンロードを実装する必要があることがよくあります。 CakePHP フレームワークを使用してアプリケーションを開発する場合、ミドルウェアは、コードを簡素化し、ファイルのアップロードおよびダウンロード機能を実装するのに役立つ非常に便利なツールです。次に、CakePHP ミドルウェアを使用してファイルのアップロードとダウンロード機能を実装する方法を紹介します。

まず、新しいミドルウェア クラスを作成し、FileHandlerMiddleware.php という名前のファイルを src/Middleware ディレクトリに作成し、次のコードを追加する必要があります。 ##

<?php

namespace AppMiddleware;

use CakeUtilityText;
use CakeHttpResponse;
use PsrHttpMessageResponseInterface;
use PsrHttpMessageServerRequestInterface;
use CakeHttpServerRequest;

class FileHandlerMiddleware
{
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
    {
        $path = WWW_ROOT . 'uploads' . DS;
        
        // 处理文件上传
        if ($request->getMethod() === 'POST' && $request->getData('file')) {
            $file = $request->getData('file');
            $fileName = Text::uuid() . '-' . $file->getClientFilename();
            $file->moveTo($path . $fileName);
            
            $response = new Response();
            $response = $response->withAddedHeader('Content-Type', 'application/json');
            $response->getBody()->write(json_encode(['success' => true, 'message' => '文件上传成功!']));
            
            return $response;
        }
        
        // 处理文件下载
        $params = $request->getAttribute('params');
        if (isset($params['file'])) {
            $fileName = $params['file'];
            $filePath = $path . $fileName;
            
            if (file_exists($filePath)) {
                $stream = fopen($filePath, 'r');
                
                $response = new Response();
                $response = $response->withAddedHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"');
                
                $response->withBody(new SlimHttpStream($stream));
                
                return $response;
            }
        }
        
        return $next($request, $response);
    }
}

上記のコードの

FileHandlerMiddleware は、ファイルのアップロードとダウンロードのためのミドルウェア クラスです。 POST リクエストを受信し、そのリクエストに file という名前のデータが含まれている場合、ミドルウェアはファイルを uploads フォルダーに保存し、成功の JSON 応答を返します。 file パラメータを含むリクエストを受信すると、ミドルウェアはファイル名に応じたファイルの内容を応答として返します。

次に、ミドルウェアをアプリケーションに登録する必要があります。

src/Application.php ファイルを開き、Application クラスの middleware メソッドにミドルウェアを登録します。コードは次のとおりです。

use AppMiddlewareFileHandlerMiddleware;

// ...

public function middleware($middlewareQueue)
{
    $middlewareQueue
        ->add(new FileHandlerMiddleware())
        // 其它中间件
        // ...
        ->add(new ErrorHandlerMiddleware(Configure::read('Error')))
        ->add(new AssetMiddleware())
        ->add(new RoutingMiddleware($this));

    return $middlewareQueue;
}

上記のコードでは、

add メソッドを使用して、FileHandlerMiddleware ミドルウェアをミドルウェア キューに登録します。ミドルウェア キューを使用して複数のミドルウェアを順番に処理し、コントローラー アクションを実行する前に登録されたミドルウェアを実行します。

これで、ファイルのアップロードおよびダウンロード機能を使用できるようになります。ファイルのアップロードを処理するコントローラー メソッドがあるとします。

public function upload()
{
    // 显示上传表单
}

次に、次のフォーム コードを対応するビュー ファイルに追加します。

<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">上传</button>
</form>

上記のコードでは、フォームを作成します。ファイルアップロードフィールドと送信ボタン。フォームの

enctype 属性は、ファイルのアップロードに必要な multipart/form-data に設定されます。

ユーザーがファイルを選択して送信ボタンをクリックすると、ファイルがサーバーにアップロードされ、成功した JSON 応答が返されます。

さらに、次の URL を使用してファイルをダウンロードすることもできます:

/download/{file_name}

たとえば、

example.jpg という名前のファイルをダウンロードするには、次のコマンドを使用できます。 URL:

/download/example.jpg

ファイルはダウンロードされた形式でユーザーに返されます。

概要:

この記事では、CakePHP ミドルウェアを使用してファイルのアップロードおよびダウンロード機能を実装する方法を紹介します。新しいミドルウェア クラスを作成することで、ファイルのアップロードおよびダウンロードのリクエストを処理し、適切な応答を返すことができます。ミドルウェアは、コードを簡素化し、アプリケーションの機能を強化するのに役立ちます。この記事が CakePHP ミドルウェアの理解と使用に役立つことを願っています。

以上がCakePHP ミドルウェア: ファイルのアップロードおよびダウンロード機能を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。