如何正确测试文件上传限制
在开发 Web 应用程序的文件上传功能时,仅因为设置了 10MB 的限制就放心了吗?实际上,上传限制测试存在许多陷阱,如果没有正确验证,就会在生产环境中发生意外错误。本文使用边界值测试的概念,说明了如何精确测试上传限制的方法。
什么是边界值测试
<strong>边界值测试</strong>是软件测试中的基本技术之一。它基于一条经验法则:错误很容易在输入值的边界附近发生,即在"恰好达到上限""上限前一个字节""超过上限一个字节"等点处。
对于文件上传限制测试,您应该至少准备以下 3 个测试用例。
- <strong>恰好等于上限的</strong>文件——验证上传成功
- <strong>低于上限 1 个字节的</strong>文件——验证肯定成功
- <strong>超过上限 1 个字节的</strong>文件——验证是否正确拒绝
注意不要混淆 MB 和 MiB
上传限制测试中最常见的错误是混淆 MB(兆字节)和 MiB(美字节)。
- <strong>1 MB</strong> = 1,000,000 字节(十进制基数,SI 单位)
- <strong>1 MiB</strong> = 1,048,576 字节(二进制基数,IEC 单位)
这个差异大约为4.86%,10MB与10MiB之间相差48,576字节。准确了解服务器端框架或云服务使用哪个单位至关重要。例如,在PHP中指定<code>upload_max_filesize</code>为「10M」时,它被解释为10MiB(10,485,760字节)。另一方面,一些CDN或API网关可能将其视为10MB(10,000,000字节)。
multipart/form-data 的开销
文件上传中使用的 <code>multipart/form-data</code> 格式除了文件本体外,还包含 boundary 字符串、Content-Disposition 标头、换行符等开销。
当服务器的大小限制检查对整个请求体进行时,即使文件本身低于限制,加上开销可能会超过。由于 Nginx 的 <code>client_max_body_size</code> 限制整个请求体的大小,需要注意这一点。
# Nginx の設定例
client_max_body_size 10m; # リクエストボディ全体の上限(MiB単位)
前端和后端的双重检查
测试时,请验证前端(JavaScript)和后端(服务器)都执行了大小检查。如果仅在前端进行检查,可以通过开发者工具或 curl 命令轻松绕过。
// フロントエンドでのサイズチェック例
const MAX_SIZE = 10 * 1024 * 1024; // 10 MiB
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file.size > MAX_SIZE) {
alert('ファイルサイズが上限を超えています');
e.target.value = '';
}
});
错误消息和用户体验确认
在边界值测试中,不仅要检查请求是否成功/失败,还要检查以下几点。
- 超过限制时是否显示清晰的错误消息?
- HTTP 状态码是否合适(例如 413 Payload Too Large)
- 大文件上传过程中进度条是否正确工作?
- 是否正确处理超时
获取测试文件的方法
准确的边界值测试需要字节级大小精确的测试文件。DevLab 提供针对主要上传限制的边界值测试文件。
- <a href="/ja/files/threshold/">边界值测试文件列表</a> — 符合 Gmail(25MB)、Discord(25MB)、WordPress(10MB)等主要服务上限的文件
- <a href="/ja/files/threshold/10mb/">10MB 边界值测试集</a> — 精确值・直前・直后的3个文件集
- <a href="/ja/files/threshold/25mb/">25MB 边界值测试集</a> — 适用于电子邮件附件和聊天工具
所有文件都包含MD5、SHA-1和SHA-256哈希值,您可以用它来验证下载后的完整性。
总结
文件上传限制的测试不仅仅是「发送一个大文件」。您应该理解 MB 和 MiB 之间的差异,考虑 multipart 开销,并使用字节级精确的测试文件来验证边界值。通过利用 DevLab 的边界值测试文件,可以高效地实施这些测试。
本文中可用的测试文件
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">边界值测试文件列表(9.9MB / 10MB / 10.1MB)</a>
- → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG 图像测试文件列表</a>
相关文章
- → <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">MB 和 MiB 不一样!文件大小单位的陷阱</a>
- → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">准确计算 multipart/form-data 的开销</a>
- → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">Web 表单文件验证实现检查清单</a>