Files
rxthinkcmf-wiki/RXThinkCMF_ThinkPhp8_EleVue/.vitepress/dist/assets/zh_tools_upload-config.md.GM-5GMxq.lean.js
T
2026-10-25 18:52:36 +08:00

105 lines
42 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{_ as i,o as a,c as n,a2 as t}from"./chunks/framework.B-QBKwc1.js";const c=JSON.parse('{"title":"上传配置详解","description":"文件上传配置定义在 config/file.php 和 .env 中,控制上传目录、域名、大小限制、允许的文件类型等。","frontmatter":{},"headers":[],"relativePath":"zh/tools/upload-config.md","filePath":"zh/tools/upload-config.md"}'),p={name:"zh/tools/upload-config.md"};function l(e,s,h,d,k,r){return a(),n("div",null,[...s[0]||(s[0]=[t(`<h1 id="_7-2-上传配置详解" tabindex="-1">7.2 上传配置详解 <a class="header-anchor" href="#_7-2-上传配置详解" aria-label="Permalink to &quot;7.2 上传配置详解&quot;">​</a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>文件上传配置定义在 <code>config/file.php</code> 和 <code>.env</code> 中,控制上传目录、域名、大小限制、允许的文件类型等。所有值通过 <code>env()</code> 函数从 <code>.env</code> 文件读取,支持多环境切换。</p></div><h2 id="配置文件" tabindex="-1">配置文件 <a class="header-anchor" href="#配置文件" aria-label="Permalink to &quot;配置文件&quot;">​</a></h2><div class="language-php vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// config/file.php — 文件上传配置</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 所有值通过 env() 函数从 .env 文件读取,支持多环境切换</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">return</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">upload_dir</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file.upload_dir</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">),</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 上传根目录(绝对路径)</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">domain_url</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file.domain_url</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">),</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 文件访问域名(拼接完整 URL 用)</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">temp_dir</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">temp</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 临时目录名(相对 upload_dir)</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">image_ext</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file.image_ext</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">gif,jpg,jpeg,png,bmp,webp,svg</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">),</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 允许的图片后缀</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file_ext</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file.file_ext</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">gif,jpg,jpeg,png,bmp,webp,svg,doc,docx,xls,xlsx,ppt,pptx,pdf,zip,rar,txt,csv,mp3,mp4,sql,js,css</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">),</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 允许的文件后缀</span></span>
<span class="line"><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">max_size</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> =&gt;</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> env</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">file.max_size</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 10</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> *</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1024</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> *</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 1024</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 最大大小(MB → 字节)</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span></code></pre></div><h2 id="配置项详解" tabindex="-1">配置项详解 <a class="header-anchor" href="#配置项详解" aria-label="Permalink to &quot;配置项详解&quot;">​</a></h2><table tabindex="0"><thead><tr><th>配置项</th><th>.env 变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>upload_dir</code></td><td><code>[FILE] UPLOAD_DIR</code></td><td>-</td><td>上传根目录(绝对路径),所有文件存储于此</td></tr><tr><td><code>domain_url</code></td><td><code>[FILE] DOMAIN_URL</code></td><td>-</td><td>文件访问域名,用于拼接完整 URL</td></tr><tr><td><code>temp_dir</code></td><td>-</td><td><code>temp</code></td><td>临时目录名(相对 upload_dir)</td></tr><tr><td><code>image_ext</code></td><td><code>[FILE] IMAGE_EXT</code></td><td><code>gif,jpg,jpeg,png,bmp,webp,svg</code></td><td>图片允许后缀</td></tr><tr><td><code>file_ext</code></td><td><code>[FILE] FILE_EXT</code></td><td>多种后缀</td><td>文件允许后缀</td></tr><tr><td><code>max_size</code></td><td><code>[FILE] MAX_SIZE</code></td><td><code>10</code></td><td>单文件最大大小(MB)</td></tr></tbody></table><h3 id="upload-dir-—-上传根目录" tabindex="-1">upload_dir — 上传根目录 <a class="header-anchor" href="#upload-dir-—-上传根目录" aria-label="Permalink to &quot;upload_dir — 上传根目录&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> D:\\xampp8.2\\htdocs\\RXThinkCMF_ThinkPhp8_EleVue\\uploads</span></span></code></pre></div><p><strong>要求:</strong></p><ul><li>必须是绝对路径</li><li>目录必须存在且有写入权限</li><li>生产环境建议放在项目目录外(防止被 Web 直接访问)</li></ul><p><strong>各环境示例:</strong></p><table tabindex="0"><thead><tr><th>环境</th><th>路径示例</th></tr></thead><tbody><tr><td>Windows 开发</td><td><code>D:\\xampp8.2\\htdocs\\RXThinkCMF_ThinkPhp8_EleVue\\uploads</code></td></tr><tr><td>Linux 开发</td><td><code>/home/www/uploads</code></td></tr><tr><td>Linux 生产</td><td><code>/opt/data/uploads</code></td></tr><tr><td>Docker</td><td><code>/data/apps/uploads</code>(挂载卷)</td></tr></tbody></table><h3 id="domain-url-—-文件访问域名" tabindex="-1">domain_url — 文件访问域名 <a class="header-anchor" href="#domain-url-—-文件访问域名" aria-label="Permalink to &quot;domain_url — 文件访问域名&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> https://cdn.example.com</span></span></code></pre></div><p><strong>要求:</strong></p><ul><li>不要以 <code>/</code> 结尾</li><li>必须是前端可访问的域名</li><li>本地开发可留空(使用相对路径)</li></ul><p><strong>各环境示例:</strong></p><table tabindex="0"><thead><tr><th>环境</th><th>域名示例</th></tr></thead><tbody><tr><td>本地开发</td><td>(留空,使用相对路径)</td></tr><tr><td>测试环境</td><td><code>http://file.thinkphp8.elevue</code></td></tr><tr><td>生产环境</td><td><code>https://cdn.example.com</code></td></tr><tr><td>对象存储</td><td><code>https://bucket-name.oss-cn-hangzhou.aliyuncs.com</code></td></tr></tbody></table><h3 id="max-size-—-文件大小限制" tabindex="-1">max_size — 文件大小限制 <a class="header-anchor" href="#max-size-—-文件大小限制" aria-label="Permalink to &quot;max_size — 文件大小限制&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 10</span></span></code></pre></div><p><strong>单位:</strong> MB(配置文件中会自动转换为字节:<code>10 * 1024 * 1024</code>)</p><p><strong>建议值:</strong></p><table tabindex="0"><thead><tr><th>场景</th><th>建议值</th><th>说明</th></tr></thead><tbody><tr><td>头像上传</td><td>2 MB</td><td>图片通常不会太大</td></tr><tr><td>文章封面</td><td>5 MB</td><td>压缩后的图片</td></tr><tr><td>通用文件上传</td><td>10 MB</td><td>默认值</td></tr><tr><td>文档上传</td><td>20 MB</td><td>PDF/Word 等</td></tr><tr><td>视频上传</td><td>100 MB</td><td>需配合分片上传</td></tr></tbody></table><h3 id="image-ext-—-图片允许后缀" tabindex="-1">image_ext — 图片允许后缀 <a class="header-anchor" href="#image-ext-—-图片允许后缀" aria-label="Permalink to &quot;image_ext — 图片允许后缀&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">IMAGE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> gif,jpg,jpeg,png,bmp,webp,svg</span></span></code></pre></div><p><strong>默认值:</strong> <code>gif,jpg,jpeg,png,bmp,webp,svg</code></p><p><strong>说明:</strong> 用于 <code>uploadFile?type=image</code> 接口,只允许图片格式上传。</p><h3 id="file-ext-—-文件允许后缀" tabindex="-1">file_ext — 文件允许后缀 <a class="header-anchor" href="#file-ext-—-文件允许后缀" aria-label="Permalink to &quot;file_ext — 文件允许后缀&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; .env</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FILE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> gif,jpg,jpeg,png,bmp,webp,svg,doc,docx,xls,xlsx,ppt,pptx,pdf,zip,rar,txt,csv,mp3,mp4,sql,js,css</span></span></code></pre></div><p><strong>默认值:</strong> 包含图片、文档、压缩包、音视频等常见格式。</p><p><strong>说明:</strong> 用于 <code>uploadFile</code> 接口,允许所有合法文件格式。</p><h2 id="-env-配置示例" tabindex="-1">.env 配置示例 <a class="header-anchor" href="#-env-配置示例" aria-label="Permalink to &quot;.env 配置示例&quot;">​</a></h2><h3 id="开发环境" tabindex="-1">开发环境 <a class="header-anchor" href="#开发环境" aria-label="Permalink to &quot;开发环境&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> D:\\xampp8.2\\htdocs\\RXThinkCMF_ThinkPhp8_EleVue\\uploads</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 10</span></span></code></pre></div><h3 id="测试环境" tabindex="-1">测试环境 <a class="header-anchor" href="#测试环境" aria-label="Permalink to &quot;测试环境&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /home/www/uploads</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> http://file.thinkphp8.elevue</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 10</span></span></code></pre></div><h3 id="生产环境" tabindex="-1">生产环境 <a class="header-anchor" href="#生产环境" aria-label="Permalink to &quot;生产环境&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /opt/data/uploads</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> https://cdn.example.com</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 10</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">IMAGE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> jpg,jpeg,png,gif,bmp,webp</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FILE_EXT</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> jpg,jpeg,png,gif,bmp,webp,doc,docx,xls,xlsx,pdf,zip,rar</span></span></code></pre></div><h3 id="对象存储-OSS-" tabindex="-1">对象存储(OSS) <a class="header-anchor" href="#对象存储-OSS-" aria-label="Permalink to &quot;对象存储(OSS)&quot;">​</a></h3><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 如果使用阿里云 OSS 等对象存储,domain_url 设为 OSS 域名</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /opt/data/uploads</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">DOMAIN_URL</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> https://your-bucket.oss-cn-hangzhou.aliyuncs.com</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MAX_SIZE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 50</span></span></code></pre></div><h2 id="目录结构" tabindex="-1">目录结构 <a class="header-anchor" href="#目录结构" aria-label="Permalink to &quot;目录结构&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>{upload_dir}/ # upload_dir(上传根目录)</span></span>
<span class="line"><span>├── temp/ # 临时目录(temp_dir)</span></span>
<span class="line"><span>│ └── 20260920/ # 按日期分目录</span></span>
<span class="line"><span>│ ├── a1b2c3d4e5f6.jpg # 随机文件名(防止冲突)</span></span>
<span class="line"><span>│ └── f6e5d4c3b2a1.png</span></span>
<span class="line"><span>├── article/ # 正式目录(由 fileSaveDir 配置)</span></span>
<span class="line"><span>│ └── 20260920/</span></span>
<span class="line"><span>│ └── 143052_xK7pMn3q.jpg</span></span>
<span class="line"><span>├── example/</span></span>
<span class="line"><span>│ └── 20260920/</span></span>
<span class="line"><span>├── user/</span></span>
<span class="line"><span>│ └── avatar/</span></span>
<span class="line"><span>│ └── 20260920/</span></span>
<span class="line"><span>└── file_template/</span></span>
<span class="line"><span> └── 20260920/</span></span></code></pre></div><h3 id="目录命名规则" tabindex="-1">目录命名规则 <a class="header-anchor" href="#目录命名规则" aria-label="Permalink to &quot;目录命名规则&quot;">​</a></h3><table tabindex="0"><thead><tr><th>目录</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>temp/</code></td><td>临时文件目录</td><td>上传后暂存于此</td></tr><tr><td><code>{module}/</code></td><td>正式目录(按模块)</td><td>由 Logic 的 <code>fileSaveDir</code> 配置</td></tr><tr><td><code>{date}/</code></td><td>日期子目录</td><td><code>20260920</code>(自动创建)</td></tr><tr><td><code>{random}.{ext}</code></td><td>随机文件名</td><td><code>a1b2c3d4e5f6.jpg</code>(防止冲突)</td></tr></tbody></table><h2 id="文件生命周期" tabindex="-1">文件生命周期 <a class="header-anchor" href="#文件生命周期" aria-label="Permalink to &quot;文件生命周期&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>1. 前端上传 → upload_file()</span></span>
<span class="line"><span> 保存到: {upload_dir}/temp/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span> 返回: https://cdn.example.com/temp/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span></span></span>
<span class="line"><span>2. 前端提交表单 → 携带 fileUrl</span></span>
<span class="line"><span> POST /api/example/add { name: &quot;测试&quot;, avatar: &quot;https://...&quot; }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>3. BaseLogic::add() → save_file()</span></span>
<span class="line"><span> 检测到 temp/ → 移动到正式目录</span></span>
<span class="line"><span> {upload_dir}/temp/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span> → {upload_dir}/example/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span> 返回相对路径入库: /uploads/example/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span></span></span>
<span class="line"><span>4. BaseLogic::detail() → get_file_url()</span></span>
<span class="line"><span> 相对路径 → 拼接域名</span></span>
<span class="line"><span> /uploads/example/20260920/a1b2c3d4e5f6.jpg</span></span>
<span class="line"><span> → https://cdn.example.com/uploads/example/20260920/a1b2c3d4e5f6.jpg</span></span></code></pre></div><h2 id="与-Logic-层的配合" tabindex="-1">与 Logic 层的配合 <a class="header-anchor" href="#与-Logic-层的配合" aria-label="Permalink to &quot;与 Logic 层的配合&quot;">​</a></h2><div class="language-php vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">class</span><span style="--shiki-dark:#97E1F1;--shiki-light:#2E8F82;"> ArticleLogic</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> extends</span><span style="--shiki-dark:#97E1F1;--shiki-dark-font-style:italic;--shiki-light:#59873A;--shiki-light-font-style:inherit;"> BaseTenantLogic</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">{</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> /**</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> * 需要自动处理的文件上传字段</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> *</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> * </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">@var</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> array</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> */</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> protected</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> array</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">fileFields</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">cover</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">];</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> /**</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> * 文件保存的子目录</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> *</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> * </span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">@var</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> string</span></span>
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> */</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> protected</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> string</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">fileSaveDir</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">article</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">}</span></span></code></pre></div><p><strong>实际路径映射:</strong></p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>配置:</span></span>
<span class="line"><span> upload_dir = /opt/data/uploads</span></span>
<span class="line"><span> fileSaveDir = article</span></span>
<span class="line"><span></span></span>
<span class="line"><span>结果:</span></span>
<span class="line"><span> 临时文件: /opt/data/uploads/temp/20260920/abc.jpg</span></span>
<span class="line"><span> 正式文件: /opt/data/uploads/article/20260920/abc.jpg</span></span>
<span class="line"><span> 数据库存: /uploads/article/20260920/abc.jpg</span></span>
<span class="line"><span> 前端显示: https://cdn.example.com/uploads/article/20260920/abc.jpg</span></span></code></pre></div><h2 id="Nginx-配置" tabindex="-1">Nginx 配置 <a class="header-anchor" href="#Nginx-配置" aria-label="Permalink to &quot;Nginx 配置&quot;">​</a></h2><h3 id="静态文件直接由-Nginx-返回" tabindex="-1">静态文件直接由 Nginx 返回 <a class="header-anchor" href="#静态文件直接由-Nginx-返回" aria-label="Permalink to &quot;静态文件直接由 Nginx 返回&quot;">​</a></h3><div class="language-nginx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 配置 Nginx 直接处理文件请求,不经过 PHP</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">location</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;"> /uploads/ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> alias </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">/opt/data/uploads/</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> expires </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">30d</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> add_header </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Cache-Control </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">&quot;public, immutable&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">}</span></span></code></pre></div><h3 id="禁止上传目录执行-PHP" tabindex="-1">禁止上传目录执行 PHP <a class="header-anchor" href="#禁止上传目录执行-PHP" aria-label="Permalink to &quot;禁止上传目录执行 PHP&quot;">​</a></h3><div class="language-nginx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 安全:禁止上传目录执行 PHP 文件</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~*</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /uploads/.*\\.php$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> deny </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;">all</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">}</span></span></code></pre></div><h3 id="禁止访问隐藏文件" tabindex="-1">禁止访问隐藏文件 <a class="header-anchor" href="#禁止访问隐藏文件" aria-label="Permalink to &quot;禁止访问隐藏文件&quot;">​</a></h3><div class="language-nginx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /\\. </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> deny </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;">all</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">}</span></span></code></pre></div><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to &quot;常见问题&quot;">​</a></h2><h3 id="问题-1-上传提示-目录不可写-" tabindex="-1">问题 1:上传提示&quot;目录不可写&quot; <a class="header-anchor" href="#问题-1-上传提示-目录不可写-" aria-label="Permalink to &quot;问题 1:上传提示&quot;目录不可写&quot;&quot;">​</a></h3><p><strong>原因:</strong> <code>upload_dir</code> 目录没有写入权限。</p><p><strong>解决:</strong></p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Linux</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">chmod</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -R</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 755</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> /opt/data/uploads</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">chown</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -R</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> www:www</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> /opt/data/uploads</span></span></code></pre></div><h3 id="问题-2-上传后图片不显示" tabindex="-1">问题 2:上传后图片不显示 <a class="header-anchor" href="#问题-2-上传后图片不显示" aria-label="Permalink to &quot;问题 2:上传后图片不显示&quot;">​</a></h3><p><strong>原因:</strong> <code>domain_url</code> 配置错误或 Nginx 未配置静态文件处理。</p><p><strong>解决:</strong></p><ol><li>检查 <code>.env</code> 中 <code>DOMAIN_URL</code> 是否正确</li><li>检查 Nginx 是否配置了 <code>/uploads/</code> 的 alias</li><li>浏览器打开图片 URL 看是否能直接访问</li></ol><h3 id="问题-3-文件大小限制不生效" tabindex="-1">问题 3:文件大小限制不生效 <a class="header-anchor" href="#问题-3-文件大小限制不生效" aria-label="Permalink to &quot;问题 3:文件大小限制不生效&quot;">​</a></h3><p><strong>原因:</strong> PHP 配置限制了上传大小。</p><p><strong>解决:</strong></p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; php.ini</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">upload_max_filesize</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 20M</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">post_max_size</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 25M</span></span>
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">max_execution_time</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 300</span></span></code></pre></div><h3 id="问题-4-临时文件未清理" tabindex="-1">问题 4:临时文件未清理 <a class="header-anchor" href="#问题-4-临时文件未清理" aria-label="Permalink to &quot;问题 4:临时文件未清理&quot;">​</a></h3><p><strong>原因:</strong> <code>temp/</code> 目录中的文件在表单提交后未被 <code>save_file()</code> 迁移。</p><p><strong>解决:</strong> 定期清理 <code>temp/</code> 目录中超过 1 天的文件:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 定时任务:每天凌晨清理 1 天前的临时文件</span></span>
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">find</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> /opt/data/uploads/temp/</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -type</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> f</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -mtime</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> +1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -delete</span></span></code></pre></div><h2 id="安全建议" tabindex="-1">安全建议 <a class="header-anchor" href="#安全建议" aria-label="Permalink to &quot;安全建议&quot;">​</a></h2><table tabindex="0"><thead><tr><th>建议</th><th>说明</th></tr></thead><tbody><tr><td>上传目录放在项目外</td><td>防止被 Web 直接访问源码</td></tr><tr><td>Nginx 禁止执行 PHP</td><td>防止上传恶意 PHP 文件并执行</td></tr><tr><td>扩展名白名单</td><td>只允许已知安全的文件类型</td></tr><tr><td>MIME 类型检查</td><td><code>finfo</code> 检测真实 MIME,防止伪造扩展名</td></tr><tr><td>随机文件名</td><td>防止路径遍历和文件名注入</td></tr><tr><td>文件大小限制</td><td>防止大文件 DoS 攻击</td></tr><tr><td>定期清理临时文件</td><td>避免磁盘空间被占满</td></tr></tbody></table>`,76)])])}const g=i(p,[["render",l]]);export{c as __pageData,g as default};