跳到内容

MB 和 MiB 是不同的!文件大小单位的陷阱

分类:基础知识
本文目前仅提供日文版本。我们正在进行翻译工作。

当你看到说「文件大小限制为10MB」的规范时,你如何理解?实际上,「MB」和「MiB」是明确不同的单位,混淆它们会导致边界值测试失败和生产故障。本文解释了文件大小单位的精确定义和开发中常见的陷阱。

MB 和 MiB 的定义

表示文件大小的单位有两种:SI 单位制(十进制)和 IEC 单位制(二进制)。

单位读法字节数标准
KB千字节1,000 BSI(十进制)
KiB基比字节1,024 BIEC(二进制)
MB兆字节1,000,000 BSI(十进制)
MiB兆比特字节1,048,576 BIEC(二进制)
GB千兆字节1,000,000,000 BSI(十进制)
GiB基比字节1,073,741,824 BIEC(二进制)

1MB 和 1MiB 的差异是 <strong>48,576 字节(约 4.86%)</strong>。对于 10MB 和 10MiB,差异达到约 485KB。当这些差异累积时,在边界值测试中会出现「本应在 10MB 以下的文件被拒绝」的情况。

开发工具、操作系统和云平台的处理差异

使问题复杂化的是,各种工具和操作系统都以自己的方式解释这个单位。

工具 / 环境对「10MB」的理解实际字节数
PHP(php.ini)10MiB10,485,760 B
Nginx(client_max_body_size)10MiB10,485,760 B
Windows 文件浏览器MiB 表示法(记为「MB」)1,048,576 B / MB
macOS FinderMB(十进制)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>