Middleware CakePHP : implémenter les fonctions de téléchargement et de téléchargement de fichiers

王林
Libérer: 2023-07-30 15:10:01
original
1455 Les gens l'ont consulté

Middleware CakePHP : implémenter des fonctions de téléchargement et de téléchargement de fichiers

Avec le développement d'Internet, les fonctions de téléchargement et de téléchargement de fichiers deviennent de plus en plus courantes. Lors du développement d’applications Web, nous devons souvent implémenter le téléchargement et le téléchargement de fichiers. Lors du développement d'applications à l'aide du framework CakePHP, le middleware est un outil très utile qui peut nous aider à simplifier le code et à implémenter des fonctions de téléchargement et de téléchargement de fichiers. Ensuite, je présenterai comment utiliser le middleware CakePHP pour implémenter les fonctions de téléchargement et de téléchargement de fichiers.

Tout d'abord, nous devons créer une nouvelle classe middleware, créer un fichier nommé FileHandlerMiddleware.php dans le répertoire src/Middleware et ajouter le code suivant : src/Middleware目录下创建一个名为FileHandlerMiddleware.php的文件,并添加以下代码:

<?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);
    }
}
Copier après la connexion

在上述代码中,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;
}
Copier après la connexion

在上述代码中,我们使用add方法将FileHandlerMiddleware中间件注册到中间件队列中。使用中间件队列可以按顺序处理多个中间件,并且在执行控制器动作之前执行注册的中间件。

现在,我们可以使用文件上传和下载功能了。假设我们有一个控制器方法来处理文件上传:

public function upload()
{
    // 显示上传表单
}
Copier après la connexion

然后,在对应的视图文件中添加如下的表单代码:

<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">上传</button>
</form>
Copier après la connexion

在上述代码中,我们创建了一个表单,其中包含一个文件上传字段和一个提交按钮。表单的enctype属性设置为multipart/form-data,这是文件上传所必需的。

当用户选择文件并点击提交按钮时,文件将被上传到服务器,并返回一个成功的JSON响应。

另外,我们还可以使用以下URL来下载文件:

/download/{file_name}
Copier après la connexion

例如,要下载名为example.jpg

/download/example.jpg
Copier après la connexion
Dans le code ci-dessus, FileHandlerMiddleware est une classe middleware pour le téléchargement et le téléchargement de fichiers. Lorsqu'une requête POST est reçue et que la requête contient des données nommées file, le middleware enregistre le fichier dans le dossier uploads et renvoie un JSON réussi. réponse. Lors de la réception d'une requête avec le paramètre file, le middleware renverra le contenu du fichier en fonction du nom du fichier en réponse.

Ensuite, nous devons enregistrer le middleware dans l'application. Ouvrez le fichier src/Application.php et enregistrez le middleware dans la méthode middleware de la classe Application. Le code est le suivant :

rrreee

Dans le code ci-dessus, nous utilisons la méthode add pour enregistrer le middleware FileHandlerMiddleware dans la file d'attente du middleware. Utilisez une file d'attente de middleware pour traiter plusieurs middlewares en séquence et exécuter les middlewares enregistrés avant d'exécuter les actions du contrôleur.

Maintenant, nous pouvons utiliser les fonctions de téléchargement et de téléchargement de fichiers. Supposons que nous ayons une méthode de contrôleur pour gérer le téléchargement de fichiers : 🎜rrreee🎜 Ensuite, ajoutez le code de formulaire suivant dans le fichier de vue correspondant : 🎜rrreee🎜 Dans le code ci-dessus, nous créons un formulaire qui contient un champ de téléchargement de fichier et un bouton de soumission. L'attribut enctype du formulaire est défini sur multipart/form-data, ce qui est requis pour les téléchargements de fichiers. 🎜🎜Lorsque l'utilisateur sélectionne un fichier et clique sur le bouton Soumettre, le fichier sera téléchargé sur le serveur et une réponse JSON réussie sera renvoyée. 🎜🎜De plus, nous pouvons également utiliser l'URL suivante pour télécharger le fichier : 🎜rrreee🎜Par exemple, pour télécharger un fichier nommé example.jpg, vous pouvez utiliser l'URL suivante : 🎜rrreee🎜Le fichier sera au format téléchargé Retour à l'utilisateur. 🎜🎜Résumé : 🎜🎜Cet article présente comment utiliser le middleware CakePHP pour implémenter les fonctions de téléchargement et de téléchargement de fichiers. En créant une nouvelle classe middleware, nous pouvons gérer les demandes de téléchargement et de téléchargement de fichiers et renvoyer les réponses appropriées. Le middleware nous aide à simplifier le code et à améliorer les fonctionnalités de l'application. J'espère que cet article vous aidera à comprendre et à utiliser le middleware CakePHP. 🎜

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!