<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                {% raw %} # Symfony 上傳文件 > 原文: [http://zetcode.com/symfony/uploadfile/](http://zetcode.com/symfony/uploadfile/) Symfony 上傳文件教程顯示了如何在 Symfony 應用中上傳文件。 在示例中,我們使用普通形式發送文件; 我們不使用表單構建器。 ## Symfony Symfony 是一組可重用的 PHP 組件和一個用于 Web 項目的 PHP 框架。 Symfony 于 2005 年發布為免費軟件。Symfony 的原始作者是 Fabien Potencier。 Symfony 受 Spring 框架和 Ruby on Rails 的極大啟發。 ## 上傳文件 為了上傳文件,`form`必須將`enctype`設置為`multipart/form-data`,并且`input`的類型設置為`file`。 同樣,在 PHP 的`php.ini`中,文件上傳由`file_uploads`選項控制。 ## Symfony 文件上傳示例 在示例中,我們有一個帶有一個輸入字段的簡單表單:要上傳的文件。 提交表單后,我們驗證 CSRF 令牌并加載圖像,檢索其名稱,并將文件存儲在`var`目錄中。 ### 創建一個 Symfony 項目并安裝包 composer 工具用于生成 Symfony 骨架項目并安裝必要的包。 ```php $ composer create-project symfony/skeleton upload $ cd upload ``` 我們創建一個新的 Symfony 項目,然后轉到項目目錄。 ```php $ composer require maker annotations twig ``` 我們為 Web 開發安裝了三個基本的 Symfony 包:`annotations`,`maker`和`twig`。 這些是生成路由,控制器和模板所必需的。 ```php $ composer require symfony/security-csrf $ composer require symfony/monolog-bundle ``` 跨站點請求偽造需要`security-csrf`包,而日志記錄則需要`monolog-bundle`包。 ```php $ composer require server --dev $ composer require symfony/profiler-pack --dev ``` 在開發階段,我們還安裝了內置服務器和分析器。 ### 構建 Symfony 應用 我們定義了要上傳圖像的目錄。 `config/services.yaml` ```php parameters: upload_dir: '../var/uploads' services: # default configuration for services in *this* file _defaults: autowire: true autoconfigure: true public: false bind: $uploadDir: '%upload_dir%' ``` 我們定義一個參數,其中包含應將圖像上傳到的目錄的名稱。 `upload_dir`參數綁定到可以注入的`$uploadDir`變量。 ```php $ php bin/console make:controller HomeController ``` 我們創建一個`HomeController`。 控制器將表單發送給客戶端。 `src/Controller/HomeController.php` ```php <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class HomeController extends AbstractController { /** * @Route("/", name="home") */ public function index() { return $this->render('home/index.html.twig'); } } ``` 這是一個簡單的控制器,可將包含 Web 表單的視圖發送給用戶。 `templates/home/index.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block body %} <form action="doUpload" method="post" enctype="multipart/form-data"> <input type="hidden" name="token" value="{{ csrf_token('upload') }}" /> <div> <label>File to upload:</label> <input type="file" name="myfile"> </div> <button type="submit">Send</button> </form> {% endblock %} ``` 此視圖創建一個表單。 它定義了`multipart/form-data`編碼類型和`file`輸入。 此外,它還具有 CSRF 隱藏輸入令牌。 ```php $ php bin/console make:controller UploadController ``` 我們創建一個`UploadController`來響應表單提交。 我們不需要為該控制器生成的樹枝模板; 因此,我們將其刪除。 `src/Controller/UploadController.php` ```php <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use App\Service\FileUploader; use Psr\Log\LoggerInterface; class UploadController extends AbstractController { /** * @Route("/doUpload", name="upload") */ public function index(Request $request, string $uploadDir, FileUploader $uploader, LoggerInterface $logger) { $token = $request->get("token"); if (!$this->isCsrfTokenValid('upload', $token)) { $logger->info("CSRF failure"); return new Response("Operation not allowed", Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } $file = $request->files->get('myfile'); if (empty($file)) { return new Response("No file specified", Response::HTTP_UNPROCESSABLE_ENTITY, ['content-type' => 'text/plain']); } $filename = $file->getClientOriginalName(); $uploader->upload($uploadDir, $file, $filename); return new Response("File uploaded", Response::HTTP_OK, ['content-type' => 'text/plain']); } } ``` 在`UploadController`中,我們檢查 CSRF 令牌,從請求中獲取文件,然后調用上載器服務`upload()`方法。 ```php public function index(Request $request, string $uploadDir, FileUploader $uploader, LoggerInterface $logger) { ``` 我們注入了請求對象,上傳目錄參數,`FileUploader`服務和記錄器。 ```php $token = $request->get("token"); if (!$this->isCsrfTokenValid('upload', $token)) { $logger->info("CSRF failure"); return new Response("Operation not allowed", Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } ``` 我們檢索令牌并使用`isCsrfTokenValid()`方法對其進行驗證。 如果驗證失敗,我們將記錄事件并發送簡單的響應`"Operation not allowed"`和`Response::HTTP_BAD_REQUEST`響應代碼。 ```php $file = $request->files->get('myfile'); if (empty($file)) { return new Response("No file specified", Response::HTTP_UNPROCESSABLE_ENTITY, ['content-type' => 'text/plain']); } ``` 我們檢查用戶是否使用`empty()`方法指定了格式的任何文件。 如果輸入字段為空,我們將使用`Response::HTTP_UNPROCESSABLE_ENTITY`響應代碼將純文本`"No file specified"`發送回客戶端。 ```php $filename = $file->getClientOriginalName(); ``` 我們使用`getClientOriginalName()`獲得文件名。 ```php $uploader->upload($uploadDir, $file, $filename); ``` 我們調用上載器服務`upload()`方法,該方法將文件移動到所選目錄。 我們向該方法傳遞目錄名,文件數據和文件名。 ```php return new Response("File uploaded", Response::HTTP_OK, ['content-type' => 'text/plain']); ``` 如果一切正常,我們將使用`Response::HTTP_OK`響應代碼將簡單的消息`"File uploaded"`發送回客戶端。 `src/Service/FileUploader.php` ```php <?php namespace App\Service; use Symfony\Component\HttpFoundation\File\Exception\FileException; use Psr\Log\LoggerInterface; class FileUploader { private $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } public function upload($uploadDir, $file, $filename) { try { $file->move($uploadDir, $filename); } catch (FileException $e){ $this->logger->error('failed to upload image: ' . $e->getMessage()); throw new FileException('Failed to upload file'); } } } ``` `FileUploader`服務使用`move()`將文件移動到上傳目錄。 當操作失敗時,我們拋出`FileException`。 這將導致生成錯誤頁面。 `templates/home/index.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block body %} <form action="doUpload" method="post" enctype="multipart/form-data"> <input type="hidden" name="token" value="{{ csrf_token('upload') }}" /> <div> <label>File to upload:</label> <input type="file" name="myfile"> </div> <button type="submit">Send</button> </form> {% endblock %} ``` 該模板包含表單。 `templates/bundles/TwigBundle/Exception/error.html.twig` ```php {% extends "base.html.twig" %} {% block title %} Problem detected {% endblock %} {% block body %} <div> <p> There was a problem: {{ exception.message }} </p> </div> {% endblock %} ``` 我們覆蓋了 Twig 的`error.html.twig`模板。 我們需要創建此確切的目錄路徑:`templates`目錄內的`bundles/TwigBundle/Exception/`。 發生`FileException`時,將為用戶生成此錯誤視圖。 `templates/base.html.twig` ```php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}Welcome!{% endblock %}</title> {% block stylesheets %}{% endblock %} </head> <body> {% block body %}{% endblock %} {% block javascripts %}{% endblock %} </body> </html> ``` 這是基本的 Twig 模板。 在本教程中,我們展示了如何在 Symfony 應用中上傳文件。 您可能也會對以下相關教程感興趣: [Symfony 簡介](/symfony/intro/), [Symfony DBAL 教程](/symfony/dbal/), [Symfony 表單教程](/symfony/form/), [Symfony 服務教程](/symfony/service/) , [Symfony 驗證教程](/symfony/validation/), [PHP 教程](/lang/php/)。 {% endraw %}
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看