Skip to content

Upload Limits of Major Services

Upload size limits for common web services and cloud storage providers — a reference for designing validation and boundary tests.

Email and messaging

Mail and chat services cap attachment size. Gmail and Outlook both settle on 25 MB, but Base64 encoding adds overhead, so the file you can actually send is somewhat smaller.

Service Limit Notes Test file
Gmail 25MB Anything over 25 MB is turned into a Google Drive link automatically 24.9MB / 25MB / 25.1MB
Outlook 25MB Up to 150 MB on Microsoft 365 (set by the administrator) 24.9MB / 25MB / 25.1MB
LINE 50MB Video is capped at five minutes; images are compressed on send 50MB
Discord (free) 25MB Up to 500 MB with Nitro 24.9MB / 25MB / 25.1MB
Discord Nitro 500MB Nitro Basic allows 50 MB -
Slack 1GB Every plan allows uploads up to 1 GB -

Social and media platforms

Social networks restrict both the format and the size of uploads. Images in particular are usually resized and recompressed, so the original file size is rarely preserved.

Service Limit Notes
Twitter / X (images) 5MB(PNG/JPG) 15 MB for GIFs, 512 MB for video via the browser
Instagram 8 MB (images) 4 GB for video and 4 GB for Reels
Facebook 10 MB (images) 10 GB for video

CMSs and web applications

In WordPress and other CMSs the default upload limit comes from the PHP configuration and the server's own limits. See how to change the WordPress upload limit for the details.

Service / CMS Default limit Notes Test file
WordPress 2MB〜10MB Depends on PHP and the server configuration; can be changed 9.9MB / 10MB / 10.1MB
Shopify 20MB Same for images, video and other files -

Cloud storage and developer services

Cloud storage and developer services generally accept large uploads, but the ceiling for a single request often differs from the ceiling for a multipart upload.

Service Limit Notes
AWS S3 5 GB (single PUT) / 5 TB (multipart) Multipart is recommended above 100 MB
Google Drive 5TB Requires free space on your storage plan
Dropbox 2 GB (web) / 50 GB (desktop app) Up to 350 GB through the API
GitHub 100 MB per file Up to 5 GB with Git LFS; 5 GB is the recommended ceiling for a whole repository
Cloudflare(Free) 100MB 500 MB on Pro, 500 MB on Business, unlimited on Enterprise

How to test an upload limit

Boundary testing is the way to pin down a service's real limit. Try three files — just under, exactly at, and just over the cap — and you can tell whether the validation is precise.

DevLab provides threshold test files at each size, exact to the byte. MD5 and SHA-256 digests are listed alongside them so you can verify integrity after downloading.

Caveats

  • The figures above reflect 2024. Check each service's current documentation.
  • With Base64 encoding you can only send about 75% of the nominal limit — the encoding costs a factor of 4/3.
  • Within one service the limit can differ by plan and by whether you go through the API or the browser.
  • Network conditions and timeout settings can make an upload fail even below the stated limit.

❓ Frequently Asked Questions

Do the limits in the table apply to attachments or to link sharing?
They are the limits on the attachment itself. Most services silently switch to storing the file in the cloud and sending a link once you exceed the limit, and from then on the effective ceiling is the storage product's. Gmail turning anything over 25 MB into a Drive link is the canonical case, and whether the recipient can open it then depends on the link's sharing settings.
How should I decide the upload limit for my own service?
Start at roughly twice the measured size of your largest expected case — 50 MB for a few hundred pages of scanned PDF, a few hundred KB for article text. Measure real files before you decide. Once decided, PHP's upload_max_filesize and post_max_size, nginx's client_max_body_size and the timeouts all have to agree on the same assumption, or something will jam at one of them.
Does a file exactly at the limit go through?
Usually not. In multipart/form-data the body is a few hundred bytes larger than the file because of the boundary strings and part headers, so a file sitting exactly on the limit pushes the whole request over it. The check is made against the body size, so set the configured limit a little above the file limit you advertise and verify it with boundary-sized test files.