Calcular con precisión la sobrecarga de multipart/form-data
¿Alguna vez ha experimentado un error 413 cuando un archivo es de solo 9MB durante la prueba de límite de tamaño de carga de archivos? Una de las causas es la sobrecarga de <code>multipart/form-data</code>. Al cargar un archivo a través de un formulario HTML, el cuerpo de la solicitud HTTP contiene no solo el archivo en sí sino también metadatos adicionales. Este artículo explica el método de cálculo preciso para esa sobrecarga y los puntos a considerar durante la prueba.
Estructura de multipart/form-data
<code>multipart/form-data</code> definido en RFC 2046 tiene una estructura donde cada parte se separa mediante una cadena de límite. Un cuerpo de solicitud HTTP real se ve así.
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
Content-Length: 10000xyz
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="file"; filename="test.png"
Content-Type: image/png
[ファイルのバイナリデータ]
------WebKitFormBoundaryABC123--
Desglose de sobrecarga
La sobrecarga de una solicitud típica de carga de archivo consta de los siguientes elementos.
| Elemento | Ejemplo | Número de bytes (Aproximado) |
|---|---|---|
| Límite inicial | ------WebKitFormBoundaryABC123\r\n | Aproximadamente 40–80 B |
| Encabezado Content-Disposition | Content-Disposition: form-data; name="file"; filename="test.png"\r\n | Aproximadamente 60–120 B |
| Encabezado Content-Type | Content-Type: image/png\r\n | Aproximadamente 25–50 B |
| Línea en blanco (final de encabezados) | \r\n | 2 B |
| Salto de línea al final de la parte | \r\n | 2 B |
| Boundary de cierre | ------WebKitFormBoundaryABC123--\r\n | Aproximadamente 42–82 B |
| <strong>Sobrecarga total</strong> | <strong>Aproximadamente 200–350 B</strong> |
Para un formulario simple con un solo archivo, la sobrecarga es aproximadamente de <strong>200–400 bytes</strong>. Si hay campos de formulario adicionales (como entradas de texto), la sobrecarga aumenta en consecuencia, pero típicamente se mantiene entre varios cientos de bytes a varios kilobytes.
Por qué ocurre el error 413
El <code>client_max_body_size</code> de Nginx limita el tamaño de todo el <strong>cuerpo de la solicitud</strong>. En otras palabras, el valor configurado debe incluir sobrecarga.
# 10MiB のファイルをアップロードさせたい場合
# オーバーヘッド(約1KB)を考慮して少し大きめに設定
client_max_body_size 11m; # MiB単位: 11 MiB = 11,534,336 バイト
Para PHP, debe configurar dos ajustes: <code>upload_max_filesize</code> (por archivo) y <code>post_max_size</code> (cuerpo POST completo).
; php.ini
upload_max_filesize = 10M ; ファイル単体の上限: 10 MiB
post_max_size = 11M ; POSTボディ全体の上限: 11 MiB(オーバーヘッド分を加算)
Método de medición precisa de la sobrecarga
Si desea conocer el sobrecargo real con precisión, puede enviar solicitudes con <code>curl</code> y medir el tamaño de la solicitud.
# ファイルのバイト数を確認
wc -c test-10mb.png
# → 10485760 test-10mb.png
# curl でアップロードしてリクエストサイズを確認
curl -X POST https://example.com/upload \
-F "file=@test-10mb.png" \
-w "リクエストボディサイズ: %{size_upload} バイト\n" \
-o /dev/null -s
# → リクエストボディサイズ: 10486062 バイト(差: 302バイト)
Diferencia con respecto a la codificación Base64
Con <code>multipart/form-data</code>, los datos binarios del archivo se envían tal cual (sin codificación Base64). La codificación Base64 solo se necesita al enviar binarios con <code>application/x-www-form-urlencoded</code> o al enviar archivos en cuerpos JSON (como <code>data:image/png;base64,...</code>).
| Método de transmisión | Sobrecarga | Caso de uso |
|---|---|---|
| multipart/form-data (formulario HTML) | Cientos de bytes a varios KB | Carga de archivo estándar |
| JSON + Base64 | Aproximadamente 33% de aumento | Transferencia de archivos a través de API |
| application/octet-stream(PUT) | Casi cero | URLs prefirmadas de S3 y más |
Puntos a considerar en las pruebas
- Determine si la verificación de límite del servidor es para "archivos individuales" o "cuerpo de solicitud completo"
- Como Nginx limita las solicitudes antes de PHP, también verifique <code>client_max_body_size</code> de Nginx
- La carga simultánea de múltiples archivos aumenta la sobrecarga
- El overhead también incluye campos de formulario adicionales (nombre, comentario, etc.)
Utilizando los <a href="/ja/files/threshold/">archivos de prueba de umbral</a> en DevLab, puede verificar el comportamiento de carga real con tamaños de archivo cercanos al límite. Valide en conjunto con su configuración de Nginx/Apache/PHP.
Resumen
- El overhead de <code>multipart/form-data</code> es aproximadamente <strong>200–400 bytes</strong> (para un archivo)
- Dado que <code>client_max_body_size</code> de Nginx limita todo el cuerpo de la solicitud, configúralo un poco más grande que el límite de tamaño de archivo
- PHP requiere configurar dos directivas: <code>upload_max_filesize</code> (archivo individual) y <code>post_max_size</code> (cuerpo POST completo).
- Al Enviar mediante JSON + Base64, el Tamaño del Archivo Aumenta Aproximadamente un 33%
Archivos de prueba para este artículo
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de archivos de prueba de umbral (9.9MB / 10MB / 10.1MB)</a>
- → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de Archivos de Prueba de Imagen PNG</a>
Artículos relacionados
- → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">Cómo Probar Correctamente los Límites de Carga de Archivos</a>
- → <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">¡MB y MiB Son Diferentes! Las Trampas de las Unidades de Tamaño de Archivo</a>