{"id":826,"date":"2025-06-12T00:35:25","date_gmt":"2025-06-11T16:35:25","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/laravel\/826.html"},"modified":"2025-06-12T00:35:25","modified_gmt":"2025-06-11T16:35:25","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8-laravel-%e4%b8%ad%e8%bf%94%e5%9b%9e%e6%b5%81%e5%93%8d%e5%ba%94%ef%bc%88%e7%94%a8%e4%ba%8e%e5%a4%a7%e6%96%87%e4%bb%b6%ef%bc%89","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/826.html","title":{"rendered":"\u5982\u4f55\u5728 Laravel \u4e2d\u8fd4\u56de\u6d41\u54cd\u5e94\uff08\u7528\u4e8e\u5927\u6587\u4ef6\uff09"},"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; Laravel &#20013;&#36820;&#22238;&#27969;&#21709;&#24212;&#65288;&#29992;&#20110;&#22823;&#25991;&#20214;&#65289;&#26102;&#65292;&#21487;&#20197;&#20351;&#29992; <code>Response::stream<\/code> &#26041;&#27861;&#12290;&#36825;&#20010;&#26041;&#27861;&#20801;&#35768;&#20320;&#22312;&#22788;&#29702;&#22823;&#37327;&#25968;&#25454;&#26102;&#65292;&#20197;&#27969;&#30340;&#24418;&#24335;&#36820;&#22238;&#21709;&#24212;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#20351;&#29992;&#36825;&#20010;&#26041;&#27861;&#30340;&#31034;&#20363;&#65306;<\/p>\n<p>&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026; <code>LargeFileController<\/code> &#30340;&#25511;&#21046;&#22120;&#65292;&#24182;&#19988;&#25105;&#20204;&#24819;&#35201;&#36820;&#22238;&#19968;&#20010; 100MB &#22823;&#23567;&#30340;&#25991;&#20214;&#12290;<\/p>\n<pre><code class=\"language-php\">use IlluminateHttpResponse;\n\nclass LargeFileController extends Controller\n{\n    public function download()\n    {\n        \/\/ &#23450;&#20041;&#25991;&#20214;&#36335;&#24452;&#21644;&#22823;&#23567;\n        $filePath = storage_path('app\/largefile.txt');\n        $fileSize = filesize($filePath);\n\n        \/\/ &#21019;&#24314;&#19968;&#20010; Response &#23545;&#35937;&#24182;&#35774;&#32622;&#27969;&#27169;&#24335;\n        return Response::stream(function () use ($filePath, $fileSize) {\n            $handle = fopen($filePath, 'rb');\n            while (!feof($handle)) {\n                echo fread($handle, 4096);\n            }\n            fclose($handle);\n        }, $fileSize, [\n            'Content-Type' =&gt; 'text\/plain',\n            'Content-Disposition' =&gt; 'attachment; filename=\"largefile.txt\"'\n        ]);\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#31034;&#20363;&#20013;&#65292;&#25105;&#20204;&#20570;&#20102;&#20197;&#19979;&#20960;&#20214;&#20107;&#65306;<\/p>\n<ol>\n<li><strong>&#23450;&#20041;&#25991;&#20214;&#36335;&#24452;&#21644;&#22823;&#23567;<\/strong>&#65306;&#25105;&#20204;&#23558;&#25991;&#20214;&#36335;&#24452;&#23384;&#20648;&#22312;&#19968;&#20010;&#21464;&#37327;&#20013;&#65292;&#24182;&#35745;&#31639;&#20854;&#22823;&#23567;&#12290;<\/li>\n<li><strong>&#21019;&#24314;&#19968;&#20010; Response &#23545;&#35937;&#24182;&#35774;&#32622;&#27969;&#27169;&#24335;<\/strong>&#65306;&#25105;&#20204;&#20351;&#29992; <code>Response::stream<\/code> &#26041;&#27861;&#21019;&#24314;&#19968;&#20010;&#21709;&#24212;&#23545;&#35937;&#65292;&#24182;&#20256;&#36882;&#19968;&#20010;&#22238;&#35843;&#20989;&#25968;&#26469;&#35835;&#21462;&#25991;&#20214;&#30340;&#20869;&#23481;&#12290;<\/li>\n<li><strong>&#35774;&#32622;&#21709;&#24212;&#22836;<\/strong>&#65306;&#25105;&#20204;&#22312;&#22238;&#35843;&#20989;&#25968;&#20013;&#35774;&#32622;&#20102;&#21709;&#24212;&#30340; Content-Type &#21644; Content-Disposition &#22836;&#65292;&#20197;&#20415;&#27983;&#35272;&#22120;&#27491;&#30830;&#22320;&#19979;&#36733;&#25991;&#20214;&#12290;<\/li>\n<\/ol>\n<h3>&#31034;&#20363;&#20195;&#30721;&#35299;&#37322;<\/h3>\n<ul>\n<li><strong>&#25171;&#24320;&#25991;&#20214;<\/strong>&#65306;&#25105;&#20204;&#20351;&#29992; <code>fopen<\/code> &#20989;&#25968;&#25171;&#24320;&#25991;&#20214;&#24182;&#20197;&#20108;&#36827;&#21046;&#35835;&#21462;&#27169;&#24335;&#25171;&#24320;&#23427;&#12290;<\/li>\n<li><strong>&#35835;&#21462;&#25991;&#20214;&#20869;&#23481;<\/strong>&#65306;&#22312;&#24490;&#29615;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992; <code>fread<\/code> &#20989;&#25968;&#27599;&#27425;&#35835;&#21462; 4096 &#23383;&#33410;&#30340;&#25968;&#25454;&#65292;&#24182;&#23558;&#20854;&#36755;&#20986;&#21040;&#21709;&#24212;&#20307;&#20013;&#12290;<\/li>\n<li><strong>&#20851;&#38381;&#25991;&#20214;<\/strong>&#65306;&#26368;&#21518;&#65292;&#25105;&#20204;&#20851;&#38381;&#25991;&#20214;&#21477;&#26564;&#12290;<\/li>\n<\/ul>\n<p>&#36890;&#36807;&#36825;&#31181;&#26041;&#24335;&#65292;&#25105;&#20204;&#21487;&#20197;&#39640;&#25928;&#22320;&#36820;&#22238;&#22823;&#25991;&#20214;&#65292;&#32780;&#19981;&#20250;&#19968;&#27425;&#24615;&#21152;&#36733;&#25972;&#20010;&#25991;&#20214;&#21040;&#20869;&#23384;&#20013;&#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>&#20171;&#32461;<\/h2><p>&#22788;&#29702;&#22823;&#22411;&#25991;&#20214;&#30340;&#26377;&#25928;&#26041;&#27861;&#23545;&#20110;&#25552;&#20379;&#33391;&#22909;&#30340;&#29992;&#25143;&#20307;&#39564;&#21644;&#20445;&#25345;&#26381;&#21153;&#22120;&#24615;&#33021;&#33267;&#20851;&#37325;&#35201;&#12290;&#22312;Laravel&#20013;&#65292;&#26368;&#26377;&#25928;&#30340;&#26041;&#27861;&#20043;&#19968;&#26159;&#36890;&#36807;&#27969;&#24335;&#21709;&#24212;&#32780;&#19981;&#26159;&#30452;&#25509;&#36820;&#22238;&#25991;&#20214;&#20869;&#23481;&#26469;&#22788;&#29702;&#25991;&#20214;&#19979;&#36733;&#12290;&#36825;&#26377;&#21161;&#20110;&#22823;&#24133;&#20943;&#23569;&#20869;&#23384;&#20351;&#29992;&#37327;&#12290;&#22312;&#36825;&#31687;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;&#22914;&#20309;&#21521;&#29992;&#25143;&#27969;&#24335;&#20256;&#36755;&#22823;&#22411;&#25991;&#20214;&#65292;&#30830;&#20445;&#24744;&#30340;Laravel&#24212;&#29992;&#31243;&#24207;&#26082;&#39640;&#25928;&#21448;&#21487;&#25193;&#23637;&#12290;<\/p><h3>&#20808;&#20915;&#26465;&#20214;<\/h3><p>&#22312;&#25105;&#20204;&#28145;&#20837;&#35752;&#35770;&#27969;&#24335;&#21709;&#24212;&#20043;&#21069;&#65292;&#20320;&#38656;&#35201;&#20102;&#35299;&#20197;&#19979;&#20960;&#28857;&#65306;<\/p><p>&#23545;PHP&#25991;&#20214;&#22788;&#29702;&#20989;&#25968;&#30340;&#29087;&#24713;&#31243;&#24230;<\/p><p>Laravel&#30340;&#35831;&#27714;\/&#21709;&#24212;&#32467;&#26500;&#30340;&#22522;&#26412;&#30693;&#35782;<\/p><p>&#20351;&#29992;&#19968;&#20010;&#36816;&#34892;&#20013;&#30340;Laravel&#23433;&#35013;&#65288;&#25512;&#33616;&#29256;&#26412;&#20026;5.5&#25110;&#26356;&#39640;&#65289;<\/p><h2>&#22522;&#26412;&#27969;&#24335;&#21709;&#24212;<\/h2><p>&#22312;Laravel&#20013;&#36820;&#22238;&#27969;&#21709;&#24212;&#26102;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#20197;&#19979;&#26041;&#27861;&#65306;<code>response()-&gt;stream()<\/code>&#26041;&#27861;&#12290;&#36825;&#26159;&#31616;&#21333;&#30340;&#19968;&#20010;&#25511;&#21046;&#22120;&#26041;&#27861;&#65292;&#29992;&#20110;&#27969;&#24335;&#20256;&#36755;&#19968;&#20010;&#22823;&#22411;&#25991;&#26412;&#25991;&#20214;&#21040;&#27983;&#35272;&#22120;&#65306;<\/p><pre><code>&lt;?php\r\n\r\nnamespace AppHttpControllers;\r\n\r\nuse IlluminateSupportFacadesStorage;\r\n\r\nclass FileDownloadController extends Controller\r\n{\r\n    public function streamLargeFile()\r\n    {\r\n        $filePath = storage_path('app\/largefile.txt');\r\n\r\n        return response()-&gt;stream(\r\n            function() use ($filePath) {\r\n                $stream = fopen($filePath, 'r');\r\n                fpassthru($stream);\r\n                fclose($stream);\r\n            },\r\n            200,\r\n            [\r\n                'Content-Type' =&gt; 'text\/plain',\r\n                'Content-Disposition' =&gt; 'attachment; filename=\"largefile.txt\"'\r\n            ]\r\n        );\r\n    }\r\n}\r\n<\/code><\/pre><p>&#19978;&#36848;&#20195;&#30721;&#23450;&#20041;&#20102;&#19968;&#20010;&#25511;&#21046;&#22120;&#26041;&#27861;&#65292;&#35813;&#26041;&#27861;&#25171;&#24320;&#19968;&#20010;&#35835;&#21462;&#27969;&#21040;&#25991;&#20214;&#65292;&#23558;&#20854;&#20869;&#23481;&#20889;&#20837;&#36755;&#20986;&#32531;&#20914;&#21306;&#65292;&#28982;&#21518;&#23558;&#25991;&#20214;&#20316;&#20026;&#19979;&#36733;&#38468;&#20214;&#21457;&#36865;&#32473;&#23458;&#25143;&#31471;&#30340;&#27983;&#35272;&#22120;&#12290;<\/p><h2>&#33258;&#23450;&#20041;&#22836;&#21644;&#27969;&#24335;&#19979;&#36733;<\/h2><p>&#26377;&#26102;&#65292;&#24744;&#21487;&#33021;&#24076;&#26395;&#23545;&#27969;&#21709;&#24212;&#20013;&#30340;HTTP&#22836;&#37096;&#26377;&#26356;&#22810;&#30340;&#25511;&#21046;&#26435;&#12290;&#20197;&#19979;&#26159;&#23454;&#29616;&#27969;&#24335;&#20256;&#36755;&#24182;&#20351;&#29992;&#33258;&#23450;&#20041;&#22836;&#30340;&#31034;&#20363;&#65306;<\/p><pre><code>&lt;?php\r\n\r\n\/\/ ... (previous code)\r\n\r\npublic function customStreamHeaders()\r\n{\r\n    \/\/ ...\r\n\r\n    return response()-&gt;stream(\r\n        \/\/ Streaming logic remains the same\r\n        \/\/ ...\r\n        function () {\r\n            \/\/ Your streaming logic here\r\n        },\r\n        200,\r\n        [\r\n            'Content-Type' =&gt; $customMimeType,\r\n            'Cache-Control' =&gt; 'no-cache, must-revalidate', \/\/ Custom cache control\r\n            'Content-Disposition' =&gt; 'inline; filename=\"' . $customFileName . '\"',\r\n        ]\r\n    );\r\n}\r\n<\/code><\/pre><p>&#36825;&#20010;&#31034;&#20363;&#20171;&#32461;&#20102;&#33258;&#23450;&#20041;HTTP&#22836;&#65292;&#21253;&#25324;&#25351;&#23450;MIME&#31867;&#22411;&#20197;&#21450;&#35774;&#32622;&#32531;&#23384;&#25511;&#21046;&#20197;&#38450;&#27490;&#21709;&#24212;&#30340;&#32531;&#23384;&#12290;<\/p><p>&#27880;&#24847;&#65306;&#30830;&#20445;&#22312;&#20351;&#29992;&#29992;&#20110;&#22836;&#37096;&#20540;&#30340;&#33258;&#23450;&#20041;&#25968;&#25454;&#26102;&#36827;&#34892;&#39564;&#35777;&#21644;&#28165;&#29702;&#65292;&#20197;&#36991;&#20813;&#35832;&#22914;&#22836;&#37096;&#27880;&#20837;&#25915;&#20987;&#31561;&#23433;&#20840;&#38382;&#39064;&#12290;<\/p><h2>&#23545;&#20110;&#26497;&#20854;&#22823;&#30340;&#25991;&#20214;&#65292;&#20998;&#22359;&#38405;&#35835;&#26159;&#19968;&#31181;&#26377;&#25928;&#30340;&#26041;&#27861;&#12290;<\/h2><p>&#23545;&#20110;&#38750;&#24120;&#22823;&#30340;&#25991;&#20214;&#65292;&#20998;&#22359;&#35835;&#21462;&#21487;&#20197;&#38450;&#27490;PHP&#20869;&#23384;&#32531;&#20914;&#21306;&#28322;&#20986;&#12290;&#35201;&#23454;&#29616;&#36825;&#19968;&#28857;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#19968;&#20010;&#24490;&#29615;&#21644;&#19968;&#20010;&#35835;&#21462;&#32531;&#20914;&#21306;&#65306;<\/p><pre><code>&lt;?php\r\n\r\n\/\/ ... (previous code)\r\n\r\npublic function chunkedFileStream()\r\n{\r\n    \/\/ ...\r\n\r\n    return response()-&gt;stream(\r\n        function() use ($filePath) {\r\n            $stream = fopen($filePath, 'r');\r\n            while (!feof($stream)) {\r\n                echo fread($stream, 1024 * 1024); \/\/ Reading in chunks of 1MB\r\n                flush();\r\n                ob_flush();\r\n            }\r\n            fclose($stream);\r\n        },\r\n        200,\r\n        [\r\n            'Content-Type' =&gt; 'text\/plain' \/\/ Custom headers can be added here\r\n        ]\r\n    );\r\n}\r\n<\/code><\/pre><p>&#35813;&#20195;&#30721;&#20197;&#27599;1MB&#22359;&#35835;&#21462;&#25991;&#20214;&#65292;&#30452;&#21040;&#21040;&#36798;&#25991;&#20214;&#26411;&#23614;&#20026;&#27490;&#65292;&#31435;&#21363;&#21521;&#29992;&#25143;&#21457;&#36865;&#27599;&#20010;&#22359;&#65292;&#23545;&#20110;&#38750;&#24120;&#22823;&#30340;&#25991;&#20214;&#26469;&#35828;&#26356;&#39640;&#25928;&#12290;<\/p><h2>&#20351;&#29992;Laravel&#30340;&#25991;&#20214;&#31995;&#32479;&#36827;&#34892;&#27969;&#24335;&#20256;&#36755;<\/h2><p>Laravel &#30340;&#25991;&#20214;&#31995;&#32479;&#25552;&#20379;&#20102;&#19968;&#31181;&#21487; Fluent &#21644;&#25277;&#35937;&#21270;&#30340;&#26412;&#22320;&#21644;&#36828;&#31243;&#23384;&#20648;&#36873;&#39033;&#30340;&#26041;&#24335;&#26469;&#24037;&#20316;&#12290;&#36825;&#37324;&#26159;&#22914;&#20309;&#20351;&#29992; Laravel &#25991;&#20214;&#31995;&#32479;&#30340; Stream &#20197;&#21709;&#24212;&#65306;<\/p><pre><code>&lt;?php\r\n\r\n\/\/ ... (previous code)\r\n\r\nuse IlluminateSupportFacadesStorage;\r\n\r\npublic function streamWithFilesystem()\r\n{\r\n    \/\/ ...\r\n\r\n    $path = 'path\/to\/your\/largefile.ext';\r\n    $filesystem = Storage::disk('local');\r\n\r\n    if (!$filesystem-&gt;exists($path)) {\r\n        abort(404);\r\n    }\r\n\r\n    $stream = $filesystem-&gt;readStream($path);\r\n\r\n    return response()-&gt;stream(\r\n        function() use ($stream) {\r\n            fpassthru($stream);\r\n        },\r\n        200,\r\n        [\r\n            'Content-Type' =&gt; $filesystem-&gt;mimeType($path),\r\n            'Content-Disposition' =&gt; 'attachment; filename=\"' . basename($path) . '\"'\r\n        ]\r\n    );\r\n}\r\n<\/code><\/pre><p>&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#25105;&#20204;&#20351;&#29992;Laravel&#30340;Storage Facade&#26469;&#35775;&#38382;&#25991;&#20214;&#31995;&#32479;&#24182;&#36820;&#22238;&#27969;&#12290;&#36825;&#31181;&#26041;&#27861;&#23454;&#29616;&#20102;&#25277;&#35937;&#21270;&#65292;&#24182;&#25903;&#25345;&#20687;Amazon S3&#36825;&#26679;&#30340;&#26412;&#22320;&#21644;&#20113;&#23384;&#20648;&#36873;&#39033;&#65292;&#20351;&#20854;&#25104;&#20026;Laravel&#24212;&#29992;&#31243;&#24207;&#30340;&#22810;&#21151;&#33021;&#19988;&#21487;&#25193;&#23637;&#35299;&#20915;&#26041;&#26696;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#20351;&#29992;Laravel&#27969;&#24335;&#20256;&#36755;&#22823;&#22411;&#25991;&#20214;&#21487;&#20197;&#26174;&#33879;&#20943;&#23569;&#20869;&#23384;&#20351;&#29992;&#24182;&#24110;&#21161;&#32500;&#25252;&#26381;&#21153;&#22120;&#24615;&#33021;&#12290;&#25105;&#20204;&#24050;&#32463;&#28085;&#30422;&#30340;&#22522;&#26412;&#27969;&#24335;&#26041;&#27861;&#21253;&#25324;&#20869;&#32622;PHP&#20989;&#25968;&#65292;&#20197;&#21450;&#21033;&#29992;Laravel&#30340;&#24378;&#22823;&#25991;&#20214;&#31995;&#32479;&#25277;&#35937;&#23618;&#36827;&#34892;&#27969;&#24335;&#22788;&#29702;&#12290;&#36890;&#36807;&#29702;&#35299;&#21644;&#21033;&#29992;&#36825;&#20123;&#25216;&#24039;&#65292;&#24744;&#21487;&#20197;&#22312;Laravel&#24212;&#29992;&#20013;&#20248;&#38597;&#22320;&#22788;&#29702;&#22823;&#25991;&#20214;&#19979;&#36733;&#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; Laravel &#20013;&#36820;&#22238;&#27969;&#21709;&#24212;&#65292;&#29305;&#21035;&#26159;&#23545;&#20110;&#22823;&#25991;&#20214;&#65292;&#21487;&#20197;&#36890;&#36807;&#20351;&#29992; <code>Response<\/code> &#31867;&#30340; <code>stream()<\/code> &#26041;&#27861;&#21644;&#33258;&#23450;&#20041;&#26041;&#27861;&#26469;&#23454;&#29616;&#12290;&#19979;&#38754;&#26159;&#22914;&#20309;&#20570;&#21040;&#36825;&#19968;&#28857;&#30340;&#19968;&#20010;&#20363;&#23376;&#65306;<\/p>\n<ol>\n<li>&#39318;&#20808;&#65292;&#30830;&#20445;&#23433;&#35013;&#20102; <code>laravel-filemanager<\/code> &#24211;&#65292;&#22914;&#26524;&#26410;&#23433;&#35013;&#65292;&#35831;&#36890;&#36807;&#20197;&#19979;&#21629;&#20196;&#36827;&#34892;&#23433;&#35013;&#65306;<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">composer require laravel-filemanager\/laravel-filemanager<\/code><\/pre>\n<ol start=\"2\">\n<li>&#22312;&#24744;&#30340;&#25511;&#21046;&#22120;&#20013;&#21019;&#24314;&#19968;&#20010;&#36820;&#22238;&#27969;&#21709;&#24212;&#30340;&#26041;&#27861;&#65292;&#20363;&#22914; <code>showFile<\/code>&#65306;<\/li>\n<\/ol>\n<pre><code class=\"language-php\">public function showFile(Request $request, $id)\n{\n    \/\/ &#33719;&#21462;&#25991;&#20214;&#36335;&#24452;\n    $file = storage_path('app\/' . $id);\n\n    if (! file_exists($file)) {\n        return response()-&gt;json(['error' =&gt; 'File not found'], 404);\n    }\n\n    \/\/ &#21019;&#24314;&#19968;&#20010;&#21709;&#24212;&#23454;&#20363;\n    $response = new Response();\n\n    \/\/ &#35774;&#32622;&#27969;&#21709;&#24212;&#30340;&#20869;&#23481;&#31867;&#22411;&#20026; \"application\/octet-stream\"\n    $response-&gt;headers-&gt;set('Content-Type', 'application\/octet-stream');\n\n    \/\/ &#35774;&#32622;&#27969;&#21709;&#24212;&#30340;&#21517;&#31216;&#20026;&#25991;&#20214;&#21517;\n    $response-&gt;name = basename($file);\n\n    \/\/ &#23558;&#25991;&#20214;&#20316;&#20026;&#27969;&#21709;&#24212;&#21457;&#36865;\n    $response-&gt;stream(function ($response) use ($file) {\n        \/\/ &#25171;&#24320;&#25991;&#20214;&#24182;&#35835;&#21462;&#25968;&#25454;\n        $handle = fopen($file, 'r');\n        while (($data = fread($handle, 8192)) !== false) {\n            \/\/ &#21457;&#36865;&#25968;&#25454;&#21040;&#23458;&#25143;&#31471;\n            $response-&gt;write($data);\n        }\n        fclose($handle);\n    });\n\n    return $response;\n}<\/code><\/pre>\n<ol start=\"3\">\n<li>&#20351;&#29992;&#27492;&#26041;&#27861;&#22788;&#29702;&#35831;&#27714;&#26102;&#65292;&#21487;&#20197;&#20687;&#36825;&#26679;&#35843;&#29992;&#23427;&#65306;<\/li>\n<\/ol>\n<pre><code class=\"language-php\">\/\/ &#31034;&#20363;&#65306;&#26174;&#31034;&#21517;&#20026; 'example.pdf' &#30340;&#25991;&#20214;\n$response = $this-&gt;showFile(request(), 'example.pdf');\n\n\/\/ &#29616;&#22312;&#20320;&#21487;&#20197;&#36890;&#36807; `$response` &#23545;&#35937;&#25805;&#20316;&#21709;&#24212;&#65292;&#22914;&#35774;&#32622; HTTP &#29366;&#24577;&#30721;&#12289;&#28155;&#21152;&#22836;&#37096;&#31561;&#12290;<\/code><\/pre>\n<p>&#27880;&#24847;&#65306;&#36825;&#20010;&#31034;&#20363;&#20551;&#35774;&#24744;&#24050;&#32463;&#35774;&#32622;&#20102;&#36866;&#24403;&#30340;&#26435;&#38480;&#20197;&#35775;&#38382;&#25991;&#20214;&#12290;&#22312;&#23454;&#38469;&#24212;&#29992;&#20013;&#65292;&#24744;&#21487;&#33021;&#38656;&#35201;&#22312;&#25511;&#21046;&#22120;&#20013;&#25552;&#20379;&#26356;&#35814;&#32454;&#30340;&#26435;&#38480;&#26816;&#26597;&#36923;&#36753;&#12290;<\/p>\n<p>&#20197;&#19978;&#23601;&#26159;&#22312; Laravel &#20013;&#36820;&#22238;&#27969;&#21709;&#24212;&#30340;&#22823;&#33268;&#27493;&#39588;&#12290;&#24076;&#26395;&#36825;&#23545;&#24744;&#26377;&#25152;&#24110;&#21161;&#65281;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#22312; Laravel &#20013;&#36820;&#22238;&#27969;&#21709;&#24212;&#65288;&#29992;&#20110;&#22823;&#25991;&#20214;&#65289;&#26102;&#038;#6..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[44],"tuisongtax":[],"class_list":["post-826","my1js","type-my1js","status-publish","hentry","my1js2nav-laravel"],"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\/826","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=826"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=826"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=826"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}