{"id":1083,"date":"2025-06-12T12:26:18","date_gmt":"2025-06-12T04:26:18","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1083.html"},"modified":"2025-06-12T12:26:18","modified_gmt":"2025-06-12T04:26:18","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8symfony%e4%b8%ad%e9%aa%8c%e8%af%81%e4%b8%8a%e4%bc%a0%e7%9a%84%e6%96%87%e4%bb%b6","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1083.html","title":{"rendered":"\u5982\u4f55\u5728Symfony\u4e2d\u9a8c\u8bc1\u4e0a\u4f20\u7684\u6587\u4ef6"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312;Symfony&#20013;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#26159;&#19968;&#20010;&#24120;&#35265;&#30340;&#38656;&#27714;&#65292;&#21487;&#20197;&#36890;&#36807;&#22810;&#31181;&#26041;&#24335;&#23454;&#29616;&#12290;&#20197;&#19979;&#26159;&#20960;&#31181;&#24120;&#35265;&#30340;&#26041;&#27861;&#65306;<\/p>\n<h3>&#26041;&#27861;&#19968;&#65306;&#20351;&#29992; <code>FileValidator<\/code><\/h3>\n<p><code>FileValidator<\/code> &#26159; Symfony &#25552;&#20379;&#30340;&#19968;&#20010;&#29992;&#20110;&#39564;&#35777;&#25991;&#20214;&#26159;&#21542;&#31526;&#21512;&#29305;&#23450;&#26465;&#20214;&#30340;&#31867;&#12290;<\/p>\n<ol>\n<li>\n<p><strong>&#21019;&#24314;&#23454;&#20307;&#31867;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppEntity;\n\nuse SymfonyComponentValidatorConstraints as Assert;\nuse SymfonyComponentHttpFoundationFileFile;\n\nclass Document\n{\n   \/**\n    * @var File|null\n    *\n    * @AssertFile(\n    *     maxSize = \"2M\",\n    *     mimeTypes = {\"application\/pdf\", \"image\/jpeg\"},\n    *     mimeTypesMessage = \"Invalid file type.\",\n    *     maxFiles = 1,\n    *     allowEmpty = false,\n    *     errorMessage = \"Please upload a valid document.\"\n    * )\n    *\/\n   private $file;\n\n   public function getFile(): ?File\n   {\n       return $this-&gt;file;\n   }\n\n   public function setFile(?File $file): self\n   {\n       $this-&gt;file = $file;\n       return $this;\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#25511;&#21046;&#22120;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppController;\n\nuse AppEntityDocument;\nuse AppFormDocumentType;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\nuse SymfonyComponentValidatorValidatorInterface;\n\n#[Route('\/document')]\nclass DocumentController extends AbstractController\n{\n   private $validator;\n\n   public function __construct(ValidatorInterface $validator)\n   {\n       $this-&gt;validator = $validator;\n   }\n\n   #[Route('\/upload', name: 'document_upload')]\n   public function upload(Request $request): Response\n   {\n       $form = $this-&gt;createForm(DocumentType::class);\n       $form-&gt;handleRequest($request);\n\n       if ($form-&gt;isSubmitted() &amp;&amp; $form-&gt;isValid()) {\n           $document = $form-&gt;getData();\n           \/\/ &#22788;&#29702;&#19978;&#20256;&#30340;&#25991;&#20214;\n           $fileName = uniqid().'.'.$document-&gt;getFile()-&gt;guessExtension();\n           $document-&gt;getFile()-&gt;move('uploads\/documents', $fileName);\n\n           \/\/ &#20445;&#23384;&#25991;&#26723;&#21040;&#25968;&#25454;&#24211;&#25110;&#20854;&#20182;&#23384;&#20648;&#20301;&#32622;\n           \/\/ ...\n\n           return $this-&gt;redirectToRoute('document_success');\n       }\n\n       return $this-&gt;render('document\/upload.html.twig', [\n           'form' =&gt; $form-&gt;createView(),\n       ]);\n   }\n\n   #[Route('\/success', name: 'document_success')]\n   public function success(): Response\n   {\n       return new Response('Document uploaded successfully!');\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#34920;&#21333;&#31867;&#22411;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppForm;\n\nuse SymfonyComponentFormAbstractType;\nuse SymfonyComponentFormExtensionCoreTypeFileType;\nuse SymfonyComponentOptionsResolverOptionsResolver;\n\nclass DocumentType extends AbstractType\n{\n   public function buildForm(FormBuilderInterface $builder, array $options): void\n   {\n       $builder\n           -&gt;add('file', FileType::class, [\n               'label' =&gt; 'Upload Document',\n           ])\n       ;\n   }\n\n   public function configureOptions(OptionsResolver $resolver): void\n   {\n       $resolver-&gt;setDefaults([\n           'data_class' =&gt; Document::class,\n       ]);\n   }\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>&#26041;&#27861;&#20108;&#65306;&#20351;&#29992; <code>FileTypeConstraint<\/code><\/h3>\n<p>&#20320;&#21487;&#20197;&#30452;&#25509;&#22312;&#23454;&#20307;&#31867;&#20013;&#20351;&#29992; <code>FileTypeConstraint<\/code> &#26469;&#23450;&#20041;&#25991;&#20214;&#30340;&#39564;&#35777;&#35268;&#21017;&#12290;<\/p>\n<ol>\n<li>\n<p><strong>&#21019;&#24314;&#23454;&#20307;&#31867;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppEntity;\n\nuse SymfonyComponentValidatorConstraints as Assert;\nuse SymfonyComponentHttpFoundationFileFile;\n\nclass Document\n{\n   \/**\n    * @var File|null\n    *\n    * @AssertFile(\n    *     maxSize = \"2M\",\n    *     mimeTypes = {\"application\/pdf\", \"image\/jpeg\"},\n    *     mimeTypesMessage = \"Invalid file type.\",\n    *     maxFiles = 1,\n    *     allowEmpty = false,\n    *     errorMessage = \"Please upload a valid document.\"\n    * )\n    *\/\n   private $file;\n\n   public function getFile(): ?File\n   {\n       return $this-&gt;file;\n   }\n\n   public function setFile(?File $file): self\n   {\n       $this-&gt;file = $file;\n       return $this;\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#25511;&#21046;&#22120;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppController;\n\nuse AppEntityDocument;\nuse AppFormDocumentType;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\nuse SymfonyComponentValidatorValidatorInterface;\n\n#[Route('\/document')]\nclass DocumentController extends AbstractController\n{\n   private $validator;\n\n   public function __construct(ValidatorInterface $validator)\n   {\n       $this-&gt;validator = $validator;\n   }\n\n   #[Route('\/upload', name: 'document_upload')]\n   public function upload(Request $request): Response\n   {\n       $form = $this-&gt;createForm(DocumentType::class);\n       $form-&gt;handleRequest($request);\n\n       if ($form-&gt;isSubmitted() &amp;&amp; $form-&gt;isValid()) {\n           $document = $form-&gt;getData();\n           \/\/ &#22788;&#29702;&#19978;&#20256;&#30340;&#25991;&#20214;\n           $fileName = uniqid().'.'.$document-&gt;getFile()-&gt;guessExtension();\n           $document-&gt;getFile()-&gt;move('uploads\/documents', $fileName);\n\n           \/\/ &#20445;&#23384;&#25991;&#26723;&#21040;&#25968;&#25454;&#24211;&#25110;&#20854;&#20182;&#23384;&#20648;&#20301;&#32622;\n           \/\/ ...\n\n           return $this-&gt;redirectToRoute('document_success');\n       }\n\n       return $this-&gt;render('document\/upload.html.twig', [\n           'form' =&gt; $form-&gt;createView(),\n       ]);\n   }\n\n   #[Route('\/success', name: 'document_success')]\n   public function success(): Response\n   {\n       return new Response('Document uploaded successfully!');\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#34920;&#21333;&#31867;&#22411;<\/strong>&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppForm;\n\nuse SymfonyComponentFormAbstractType;\nuse SymfonyComponentFormExtensionCoreTypeFileType;\nuse SymfonyComponentOptionsResolverOptionsResolver;\n\nclass DocumentType extends AbstractType\n{\n   public function buildForm(FormBuilderInterface $builder, array $options): void\n   {\n       $builder\n           -&gt;add('file', FileType::class, [\n               'label' =&gt; 'Upload Document',\n           ])\n       ;\n   }\n\n   public function configureOptions(OptionsResolver $resolver): void\n   {\n       $resolver-&gt;setDefaults([\n           'data_class' =&gt; Document::class,\n       ]);\n   }\n}<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>&#36890;&#36807;&#20197;&#19978;&#26041;&#27861;&#65292;&#20320;&#21487;&#20197;&#22312; Symfony &#20013;&#36731;&#26494;&#22320;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#65292;&#24182;&#26681;&#25454;&#38656;&#35201;&#36827;&#34892;&#36827;&#19968;&#27493;&#30340;&#25805;&#20316;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#27010;&#35272;<\/h2><p>&#25991;&#20214;&#19978;&#20256;&#26159;Web&#24212;&#29992;&#31243;&#24207;&#20013;&#30340;&#24120;&#35265;&#21151;&#33021;&#65292;Symfony&#65292;&#19968;&#20010;&#27969;&#34892;&#30340;PHP&#26694;&#26550;&#65292;&#25552;&#20379;&#20102;&#22788;&#29702;&#25991;&#20214;&#19978;&#20256;&#30340;&#24378;&#22823;&#25903;&#25345;&#12290;&#28982;&#32780;&#65292;&#20165;&#20165;&#19978;&#20256;&#25991;&#20214;&#24448;&#24448;&#19981;&#22815;&#12290;&#25105;&#20204;&#36824;&#38656;&#35201;&#30830;&#20445;&#36825;&#20123;&#25991;&#20214;&#23433;&#20840;&#65292;&#31526;&#21512;&#29305;&#23450;&#26631;&#20934;&#65292;&#24182;&#19981;&#20250;&#23545;&#25105;&#20204;&#30340;&#24212;&#29992;&#36896;&#25104;&#20219;&#20309;&#25439;&#23475;&#12290;&#39564;&#35777;&#26159;&#23454;&#29616;&#21487;&#38752;&#21644;&#23433;&#20840;&#30340;&#25991;&#20214;&#19978;&#20256;&#30340;&#20851;&#38190;&#12290;&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;&#22914;&#20309;&#20351;&#29992;Symfony&#26469;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#12290;<\/p><p>&#25105;&#20204;&#23558;&#28085;&#30422;&#20174;&#35774;&#32622;&#39033;&#30446;&#12289;&#37197;&#32622;&#25991;&#20214;&#19978;&#20256;&#21040;&#30830;&#20445;&#36825;&#20123;&#25991;&#20214;&#31526;&#21512;&#24744;&#29305;&#23450;&#35201;&#27714;&#30340;&#22823;&#23567;&#12289;&#31867;&#22411;&#20197;&#21450;&#20854;&#20182;&#23646;&#24615;&#30340;&#25152;&#26377;&#20869;&#23481;&#12290;&#25152;&#20197;&#65292;&#35753;&#25105;&#20204;&#24320;&#22987;&#21543;&#12290;<\/p><p>&#20808;&#20915;&#26465;&#20214;<\/p><p>Composer &#20840;&#29699;&#23433;&#35013;&#65292;&#29992;&#20110;&#31649;&#29702;&#20381;&#36182;&#39033;&#12290;<\/p><p>&#24744;&#31995;&#32479;&#19978;&#24050;&#23433;&#35013; PHP 7.4 &#25110;&#26356;&#39640;&#29256;&#26412;&#12290;<\/p><p>&#23545;Symfony&#26694;&#26550;&#30340;&#22522;&#26412;&#29702;&#35299;&#12290;<\/p><h2>&#24320;&#22987;&#20351;&#29992;<\/h2><h3>&#35774;&#32622;Symfony&#39033;&#30446;<\/h3><pre><code>composer create-project symfony\/skeleton my_project_name\ncd my_project_name\ncomposer require symfony\/web-server-bundle --dev\ncomposer require symfony\/form\ncomposer require symfony\/validator\n<\/code><\/pre><p>&#22312;&#36827;&#20837;&#39033;&#30446;&#30446;&#24405;&#24182;&#23433;&#35013;&#24517;&#35201;&#32452;&#20214;&#20043;&#21518;&#65292;&#24744;&#38656;&#35201;&#20026;&#25991;&#20214;&#19978;&#20256;&#21019;&#24314;&#19968;&#20010;&#34920;&#21333;&#31867;&#22411;&#12290;<\/p><h3>&#21019;&#24314;&#25991;&#20214;&#19978;&#20256;&#34920;&#21333;<\/h3><pre><code>\/\/ src\/Form\/UploadFileType.php\nnamespace AppForm;\n\nuse SymfonyComponentFormAbstractType;\nuse SymfonyComponentFormExtensionCoreTypeFileType;\nuse SymfonyComponentFormFormBuilderInterface;\nuse SymfonyComponentOptionsResolverOptionsResolver;\n\nclass UploadFileType extends AbstractType\n{\n    public function buildForm(FormBuilderInterface $builder, array $options)\n    {\n        $builder\n            -&gt;add('upload_file', FileType::class, [\n                'label' =&gt; 'Upload File',\n                \/\/ unmapped means that this field is not associated to any entity property\n                'mapped' =&gt; false,\n                \/\/ make it optional so you don't have to re-upload the file\n                \/\/ whenever you edit the details\n                'required' =&gt; false,\n            ]);\n    }\n\n    public function configureOptions(OptionsResolver $resolver)\n    {\n        $resolver-&gt;setDefaults([\n            \/\/ ... set your default options here\n        ]);\n    }\n}\n<\/code><\/pre><p>&#22312;&#24744;&#25552;&#20132;&#30340;&#34920;&#21333;&#31867;&#22411;&#35774;&#32622;&#22909;&#20043;&#21518;&#65292;&#25105;&#20204;&#29616;&#22312;&#36716;&#21521;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#12290;<\/p><h2>&#23454;&#26045;&#25991;&#20214;&#39564;&#35777;<\/h2><p>Symfony &#20351;&#29992;&#30340;&#26159; Symfony&#12290;<code>Validator<\/code>&#32452;&#20214;&#29992;&#20110;&#39564;&#35777;&#34920;&#21333;&#12290;&#24744;&#21487;&#20197;&#36890;&#36807;&#22312;&#34920;&#21333;&#23383;&#27573;&#19978;&#25110;&#20351;&#29992;&#27880;&#35299;&#12289;YAML&#12289;XML &#25110; PHP &#30340;&#26041;&#24335;&#65292;&#30452;&#25509;&#23545;&#25968;&#25454;&#31867;&#36827;&#34892;&#32422;&#26463;&#12290;<\/p><p>&#35753;&#25105;&#20204;&#30452;&#25509;&#23545;&#34920;&#21333;&#31867;&#22411;&#24212;&#29992;&#19968;&#20123;&#32422;&#26463;&#26465;&#20214;&#12290;<\/p><pre><code>\/\/ src\/Form\/UploadFileType.php\n\n\/\/ ... previous code\nuse SymfonyComponentValidatorConstraintsFile;\n\n\/\/ ... inside the buildForm method\n$builder\n    \/\/ ... previous field definitions\n    -&gt;add('upload_file', FileType::class, [\n        'label' =&gt; 'Upload File',\n        'mapped' =&gt; false,\n        'constraints' =&gt; [\n            new File([\n                'maxSize' =&gt; '1024k',\n                'mimeTypes' =&gt; [\n                    'application\/pdf',\n                    'application\/x-pdf',\n                ],\n                'mimeTypesMessage' =&gt; 'Please upload a valid PDF document',\n            ])\n        ],\n    ]);\n<\/code><\/pre><p>&#29616;&#22312;&#65292;&#35753;&#25105;&#20204;&#30475;&#30475;&#22914;&#20309;&#22312;&#25511;&#21046;&#22120;&#20013;&#22788;&#29702;&#34920;&#21333;&#25552;&#20132;&#24182;&#36827;&#34892;&#39564;&#35777;&#12290;<\/p><h3>&#22788;&#29702;&#34920;&#21333;&#25552;&#20132;&#21644;&#25991;&#20214;&#39564;&#35777;<\/h3><pre><code>\/\/ src\/Controller\/SomeController.php\nnamespace AppController;\n\nuse SymfonyComponentHttpFoundationRequest;\nuse AppFormUploadFileType;\n\n\/\/ ... other use statements\n\nclass SomeController extends AbstractController\n{\n    public function new(Request $request)\n    {\n        $form = $this-&gt;createForm(UploadFileType::class);\n        $form-&gt;handleRequest($request);\n\n        if ($form-&gt;isSubmitted() &amp;&amp; $form-&gt;isValid()) {\n            $file = $form['upload_file']-&gt;getData();\n\n            if ($file) {\n                $originalFilename = pathinfo($file-&gt;getClientOriginalName(), PATHINFO_FILENAME);\n                \/\/ Move the file to the directory where brochures are stored\n                try {\n                    $file-&gt;move(\n                        $this-&gt;getParameter('brochures_directory'),\n                        $originalFilename\n                    );\n                } catch (FileException $e) {\n                    \/\/ ... handle exception if something happens during file upload\n                }\n            }\n            \/\/ ... persist the other form data if needed\n            return $this-&gt;redirect($this-&gt;generateUrl('some_route'));\n        }\n\n        return $this-&gt;render('some\/new.html.twig', [\n            'form' =&gt; $form-&gt;createView(),\n        ]);\n    }\n}<\/code><\/pre><p>&#36825;&#20010;&#31616;&#21333;&#30340;&#20363;&#23376;&#23637;&#31034;&#20102;&#22914;&#20309;&#36890;&#36807;&#35774;&#32622;&#25991;&#20214;&#31867;&#22411;&#21644;&#22823;&#23567;&#30340;&#38480;&#21046;&#26469;&#30830;&#20445;&#25991;&#20214;&#19978;&#20256;&#12290;&#28982;&#32780;&#65292;&#39564;&#35777;&#24182;&#19981;&#27490;&#20110;&#27492;&#12290;&#20320;&#21487;&#20197;&#36827;&#19968;&#27493;&#21019;&#24314;&#33258;&#23450;&#20041;&#39564;&#35777;&#35268;&#21017;&#65292;&#26816;&#26597;&#25991;&#20214;&#30340;&#20869;&#23481;&#31561;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22312;&#26412;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#24050;&#32463;&#20171;&#32461;&#20102;&#22914;&#20309;&#35774;&#32622;Symfony&#39033;&#30446;&#12289;&#21019;&#24314;&#25991;&#20214;&#19978;&#20256;&#34920;&#21333;&#12289;&#25351;&#23450;&#39564;&#35777;&#35268;&#21017;&#20197;&#21450;&#22788;&#29702;&#25552;&#20132;&#26102;&#30340;&#39564;&#35777;&#26816;&#26597;&#12290;&#35760;&#20303;&#65292;&#39564;&#35777;&#25991;&#20214;&#30340;&#30446;&#26631;&#19981;&#20165;&#26159;&#36981;&#23432;&#20320;&#35774;&#23450;&#30340;&#35268;&#21017;&#65292;&#36824;&#35201;&#30830;&#20445;&#24212;&#29992;&#30340;&#23433;&#20840;&#24615;&#65292;&#38450;&#27490;&#28508;&#22312;&#26377;&#23475;&#25991;&#20214;&#34987;&#19978;&#20256;&#12290;<\/p><p>&#25991;&#20214;&#39564;&#35777;&#22312;Symfony&#20013;&#26082;&#28789;&#27963;&#21448;&#24378;&#22823;&#65292;&#25484;&#25569;&#23427;&#21487;&#20197;&#26174;&#33879;&#25552;&#21319;&#29992;&#25143;&#20307;&#39564;&#21644;&#24212;&#29992;&#30340;&#23433;&#20840;&#24615;&#12290;&#35831;&#22810;&#22810;&#32451;&#20064;&#19981;&#21516;&#31867;&#22411;&#30340;&#25991;&#20214;&#31867;&#22411;&#21644;&#39564;&#35777;&#22330;&#26223;&#65292;&#20197;&#25552;&#39640;&#22788;&#29702;Symfony&#20013;&#30340;&#25991;&#20214;&#19978;&#20256;&#30340;&#33021;&#21147;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Symfony &#20013;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#26159;&#19968;&#31181;&#24120;&#35265;&#30340;&#38656;&#27714;&#65292;&#23588;&#20854;&#26159;&#22312;&#22788;&#29702;&#21160;&#24577;&#20869;&#23481;&#26102;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#20351;&#29992; Symfony &#30340; Filesystem &#21644; File &#23433;&#20840;&#26694;&#26550;&#26469;&#39564;&#35777;&#21644;&#31649;&#29702;&#25991;&#20214;&#12290;<\/p>\n<h3>1. &#39564;&#35777;&#25991;&#20214;&#31867;&#22411;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23450;&#20041;&#21738;&#20123;&#31867;&#22411;&#30340;&#25991;&#20214;&#21487;&#20197;&#34987;&#19978;&#20256;&#12290;&#20320;&#21487;&#20197;&#36890;&#36807;&#33258;&#23450;&#20041; <code>File<\/code> &#31867;&#22411;&#30340;&#26500;&#36896;&#20989;&#25968;&#21442;&#25968;&#26469;&#23454;&#29616;&#36825;&#19968;&#28857;&#65306;<\/p>\n<pre><code class=\"language-php\">class MyFileType extends AbstractType {\n    public function buildView(FormView $view, FormInterface $form, array $options): void {\n        $view-&gt;vars['file_type'] = $options['file_type'];\n    }\n}<\/code><\/pre>\n<p>&#28982;&#21518;&#65292;&#20320;&#38656;&#35201;&#22312;&#25511;&#21046;&#22120;&#26041;&#27861;&#20013;&#23454;&#20363;&#21270;&#36825;&#20010;&#31867;&#24182;&#20256;&#20837;&#27491;&#30830;&#30340;&#31867;&#22411;&#65306;<\/p>\n<pre><code class=\"language-php\">public function uploadAction(Request $request) {\n    $fileType = new MyFileType(['image\/jpeg', 'image\/png']);\n    return $this-&gt;uploadFile($request, $fileType);\n}\n\nprivate function uploadFile(Request $request, MyFileType $type): Response {\n    \/\/ ...\n}<\/code><\/pre>\n<h3>2. &#25991;&#20214;&#22823;&#23567;&#38480;&#21046;<\/h3>\n<p>&#20026;&#20102;&#38450;&#27490;&#29992;&#25143;&#19978;&#20256;&#36807;&#22823;&#25110;&#36807;&#23567;&#30340;&#25991;&#20214;&#65292;&#20320;&#21487;&#20197;&#35774;&#32622;&#19968;&#20010;&#33539;&#22260;&#12290;&#36825;&#21487;&#20197;&#36890;&#36807;&#35775;&#38382; <code>$request<\/code> &#23545;&#35937;&#20013;&#30340; <code>files<\/code> &#23646;&#24615;&#26469;&#23436;&#25104;&#65292;&#24182;&#26681;&#25454;&#20854;&#38190;&#65288;&#22914; <code>'myfile'<\/code>&#65289;&#26816;&#26597;&#25991;&#20214;&#22823;&#23567;&#65306;<\/p>\n<pre><code class=\"language-php\">if ($request-&gt;isMethod('POST')) {\n    $maxSizeBytes = 500 * 1024 * 1024; \/\/ 5MB\n    if (count($request-&gt;files-&gt;all()) === 1 &amp;&amp; $request-&gt;files-&gt;get('myfile') !== null) {\n        $uploadedFile = $request-&gt;files-&gt;get('myfile');\n        if ($uploadedFile instanceof UploadedFile) {\n            if (!$uploadedFile-&gt;isValid() || !$uploadedFile-&gt;getSize() &lt;= $maxSizeBytes) {\n                throw new BadRequestHttpException(sprintf('The file size must be less than %d bytes.', $maxSizeBytes));\n            }\n        } else {\n            throw new BadRequestHttpException('Invalid file.');\n        }\n    }\n}<\/code><\/pre>\n<h3>3. &#25991;&#20214;&#25193;&#23637;&#21517;&#39564;&#35777;<\/h3>\n<p>&#38500;&#20102;&#25991;&#20214;&#31867;&#22411;&#21644;&#22823;&#23567;&#20043;&#22806;&#65292;&#20320;&#36824;&#21487;&#33021;&#38656;&#35201;&#39564;&#35777;&#25991;&#20214;&#25193;&#23637;&#21517;&#12290;&#36825;&#21487;&#20197;&#36890;&#36807;&#23558;&#25991;&#20214;&#25193;&#23637;&#21517;&#28155;&#21152;&#21040; <code>$fileType<\/code> &#23454;&#20363;&#20013;&#26469;&#23454;&#29616;&#65306;<\/p>\n<pre><code class=\"language-php\">$uploadedFile = $request-&gt;files-&gt;get('myfile');\nif ($uploadedFile instanceof UploadedFile) {\n    $type = $type-&gt;build(array(\n        'extension' =&gt; $uploadedFile-&gt;getClientOriginalExtension(),\n        'name'      =&gt; $uploadedFile-&gt;getClientOriginalName()\n    ));\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; <code>UploadController.php<\/code> &#30340;&#25511;&#21046;&#22120;&#65292;&#20854;&#20013;&#21253;&#21547;&#20102;&#19978;&#36848;&#21151;&#33021;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\nuse SymfonyComponentValidatorConstraintsFile;\nuse SymfonyComponentValidatorContextExecutionContextInterface;\nuse SymfonyComponentValidatorConstraintViolationList;\n\nclass UploadController extends AbstractController\n{\n    \/**\n     * @Route(\"\/upload\", name=\"app_upload\")\n     *\/\n    public function uploadAction(Request $request)\n    {\n        $fileType = new MyFileType(['image\/jpeg', 'image\/png']);\n        return $this-&gt;uploadFile($request, $fileType);\n    }\n\n    private function uploadFile(Request $request, MyFileType $type): Response\n    {\n        $maxSizeBytes = 500 * 1024 * 1024; \/\/ 5MB\n        if (count($request-&gt;files-&gt;all()) === 1 &amp;&amp; $request-&gt;files-&gt;get('myfile') !== null) {\n            $uploadedFile = $request-&gt;files-&gt;get('myfile');\n\n            if ($uploadedFile instanceof UploadedFile) {\n                if (!$uploadedFile-&gt;isValid() || !$uploadedFile-&gt;getSize() &lt;= $maxSizeBytes) {\n                    throw new BadRequestHttpException(sprintf('The file size must be less than %d bytes.', $maxSizeBytes));\n                }\n\n                $context = $this-&gt;createValidatorContext();\n                $violations = $this-&gt;validateFile($uploadedFile, $type, $context);\n\n                foreach ($violations as $violation) {\n                    $this-&gt;addViolation($violation, $context);\n                }\n\n                if (!empty($violations)) {\n                    throw new BadRequestHttpException('Validation errors occurred.');\n                }\n            } else {\n                throw new BadRequestHttpException('Invalid file.');\n            }\n        }\n\n        return new Response('File uploaded successfully!');\n    }\n\n    private function validateFile(UploadedFile $file, MyFileType $type, ExecutionContextInterface $context): ConstraintViolationList\n    {\n        $constraint = $type-&gt;build();\n\n        if ($file-&gt;getClientMimeType() != $constraint-&gt;getExtension()) {\n            $context-&gt;addViolationAt(\n                $constraint-&gt;getName(),\n                [\n                    'message' =&gt; sprintf('File extension \"%s\" is not allowed.', $file-&gt;getClientOriginalExtension())\n                ]\n            );\n        }\n\n        return $context-&gt;getValidator()-&gt;validate($file, $constraint);\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;&#21517;&#20026; <code>MyFileType<\/code> &#30340;&#33258;&#23450;&#20041;&#31867;&#22411;&#65292;&#29992;&#20110;&#39564;&#35777;&#25991;&#20214;&#31867;&#22411;&#21644;&#22823;&#23567;&#12290;&#28982;&#21518;&#65292;&#25105;&#20204;&#22312; <code>uploadFile()<\/code> &#26041;&#27861;&#20013;&#20351;&#29992;&#20102;&#36825;&#20123;&#29305;&#24615;&#26469;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#12290;&#22914;&#26524;&#39564;&#35777;&#22833;&#36133;&#65292;&#25105;&#20204;&#23558;&#25243;&#20986;&#24322;&#24120;&#24182;&#36820;&#22238;&#38169;&#35823;&#28040;&#24687;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312;Symfony&#20013;&#39564;&#35777;&#19978;&#20256;&#30340;&#25991;&#20214;&#26159;&#19968;&#20010;&#24120;&#35265;&#30340;&#038;#386..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1083","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1083"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1083"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1083"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}