MB 和 MiB 是不同的!文件大小单位的陷阱
当你看到说「文件大小限制为10MB」的规范时,你如何理解?实际上,「MB」和「MiB」是明确不同的单位,混淆它们会导致边界值测试失败和生产故障。本文解释了文件大小单位的精确定义和开发中常见的陷阱。
MB 和 MiB 的定义
表示文件大小的单位有两种:SI 单位制(十进制)和 IEC 单位制(二进制)。
| 单位 | 读法 | 字节数 | 标准 |
|---|---|---|---|
| KB | 千字节 | 1,000 B | SI(十进制) |
| KiB | 基比字节 | 1,024 B | IEC(二进制) |
| MB | 兆字节 | 1,000,000 B | SI(十进制) |
| MiB | 兆比特字节 | 1,048,576 B | IEC(二进制) |
| GB | 千兆字节 | 1,000,000,000 B | SI(十进制) |
| GiB | 基比字节 | 1,073,741,824 B | IEC(二进制) |
1MB 和 1MiB 的差异是 <strong>48,576 字节(约 4.86%)</strong>。对于 10MB 和 10MiB,差异达到约 485KB。当这些差异累积时,在边界值测试中会出现「本应在 10MB 以下的文件被拒绝」的情况。
开发工具、操作系统和云平台的处理差异
使问题复杂化的是,各种工具和操作系统都以自己的方式解释这个单位。
| 工具 / 环境 | 对「10MB」的理解 | 实际字节数 |
|---|---|---|
| PHP(php.ini) | 10MiB | 10,485,760 B |
| Nginx(client_max_body_size) | 10MiB | 10,485,760 B |
| Windows 文件浏览器 | MiB 表示法(记为「MB」) | 1,048,576 B / MB |
| macOS Finder | MB(十进制) | 1,000,000 B / MB |
| AWS S3 管理控制台 | MiB 显示 | 1,048,576 B / MB |
| Gmail (附件上限) | MB(十进制) | 25,000,000 B |
特别需要注意的是,Windows显示"MB"但实际上计算的是"MiB"。Windows中显示为"9.9 MB"的文件实际上可能是<code>9.9 × 1,048,576 = 10,381,301 字节</code>。这比10MB(10,000,000字节)更大,不会对Gmail(25MB限制)造成问题,但会无法通过PHP的<code>upload_max_filesize = 10M</code>(<code>=10MiB = 10,485,760字节</code>)。
PHP中的实际示例
在 PHP 配置文件中,单位的解释如下。
; php.ini の設定
upload_max_filesize = 10M ; 10 MiB = 10,485,760 バイト
post_max_size = 12M ; 12 MiB = 12,582,912 バイト
验证上传文件的大小时,以字节为单位进行比较是最可靠的。
// バイト単位で比較(安全)
$maxBytes = 10 * 1024 * 1024; // 10 MiB = 10,485,760 バイト
if ($_FILES['file']['size'] > $maxBytes) {
throw new \RuntimeException('ファイルサイズが上限を超えています');
}
// NG: 文字列の "10MB" を解析する場合は単位の解釈に注意
JavaScript 中的实际示例
// File API では size プロパティがバイト数を返す
const file = event.target.files[0];
const MAX_SIZE_MIB = 10 * 1024 * 1024; // 10 MiB
const MAX_SIZE_MB = 10 * 1000 * 1000; // 10 MB
// サーバー側に合わせて単位を統一する
if (file.size > MAX_SIZE_MIB) {
alert(`ファイルサイズ上限は 10 MiB (${MAX_SIZE_MIB.toLocaleString()} バイト) です`);
}
对边界值测试的影响
在测试「10MB 限制」时,重要的是在选择合适的测试文件之前,先了解服务器的实际限制值。
- PHP <code>upload_max_filesize = 10M</code> → 上限为 <strong>10,485,760 字节 (10 MiB)</strong>
- Gmail 附件上限 → 上限为 <strong>25,000,000 字节 (25 MB)</strong>
- Discord 免费计划 → 限制为<strong>25,000,000 字节(25 MB)</strong>
DevLab 的 <a href="/ja/files/threshold/">阈值测试文件</a> 提供字节单位精确大小的文件。在测试前检查服务器配置,并选择相应的阈值文件。
总结
- <strong>MB = 1,000,000 字节</strong>(SI 单位),<strong>MiB = 1,048,576 字节</strong>(IEC 单位)
- PHP 和 Nginx 将 "M" 解释为 <strong>MiB</strong>。
- Windows 显示「MB」但以 <strong>MiB</strong> 计算
- macOS 使用 <strong>MB</strong>(十进制)显示
- 使用字节级精确的测试文件,并根据服务器设置的解释方式选择
→ <a href="/ja/reference/file-size-units/">文件大小单位换算表在这里</a>
本文中可用的测试文件
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">边界值测试文件列表(9.9MB / 10MB / 10.1MB)</a>
相关文章
- → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">如何正确测试文件上传限制</a>
- → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">准确计算 multipart/form-data 的开销</a>