阿里云服务器本身并没有全局性的“单次上传100M”硬性限制。你遇到的这个限制,通常来自以下几个层面之一:
- Web服务器配置:如 Nginx 的
client_max_body_size或 Apache 的LimitRequestBody。 - 应用层框架限制:如 Spring Boot 的
spring.servlet.multipart.max-file-size或 PHP 的upload_max_filesize/post_max_size。 - 前端JS限制:某些上传组件(如 Element UI、Ant Design)默认限制了单个文件体积。
- OSS SDK 分片上传未启用:如果你是通过 OSS SDK 直传,且未正确配置分片阈值。
因此,“分卷压缩上传”是一种绕过单文件体积限制的有效策略,但更推荐的是直接修改服务端/应用层配置 + 使用分片上传技术。下面我将从两个角度给出方案:
✅ 推荐方案一:优化服务端配置(治本)
1. Nginx 调整
编辑 /etc/nginx/nginx.conf 或对应站点配置文件:
http {
client_max_body_size 500M; # 根据需求调整,建议不超过服务器内存和磁盘IO能力
}
重启 Nginx:systemctl restart nginx
2. PHP 环境(如宝塔面板)
php.ini中设置:upload_max_filesize = 500M post_max_size = 500M max_execution_time = 300- 若使用宝塔,可在“软件商店 → PHP管理 → 配置修改”中同步修改。
3. Java/Spring Boot
spring:
servlet:
multipart:
max-file-size: 500MB
max-request-size: 500MB
4. Node.js (Express + multer)
const multer = require('multer');
const upload = multer({
limits: { fileSize: 500 * 1024 * 1024 } // 500MB
});
⚠️ 注意:调大限制会增加DDoS攻击风险,建议配合 CDN、WAF、限流策略使用。
✅ 推荐方案二:客户端分卷压缩上传(治标+兼容旧系统)
如果无法修改服务端配置,或需兼容老旧系统,可采用前端分卷压缩后逐个上传的方式。
🛠 工具推荐
1. 7-Zip + 命令行脚本(Linux/macOS)
# 将 largefile.dat 分割为每份 90MB
7z a -v90m archive.7z largefile.dat
# 生成 archive.7z.001, archive.7z.002 ...
然后编写脚本批量上传:
for f in archive.7z.*; do
curl -X POST "https://your-server.com/upload"
-F "file=@$f"
-H "Authorization: Bearer YOUR_TOKEN"
done
2. Python 实现自动分卷 + 上传(跨平台)
import os
import subprocess
import requests
def split_and_upload(file_path, chunk_size_mb=90, upload_url):
base_name = os.path.splitext(file_path)[0]
# 使用 7z 分卷
subprocess.run([
'7z', 'a', '-v{}m'.format(chunk_size_mb),
f'{base_name}.7z', file_path
])
# 获取所有分卷文件
chunks = [f for f in os.listdir('.') if f.startswith(f'{base_name}.7z.') and f.endswith('.001')]
chunks.sort() # 确保顺序
for i, chunk in enumerate(chunks):
print(f"Uploading chunk {i+1}/{len(chunks)}")
with open(chunk, 'rb') as f:
files = {'file': (chunk, f)}
response = requests.post(upload_url, files=files)
if response.status_code != 200:
raise Exception(f"Upload failed for {chunk}: {response.text}")
print("All chunks uploaded successfully.")
# 使用示例
split_and_upload('large_video.mp4', 90, 'https://your-server.com/api/upload')
3. 前端 JS 分片上传(无需压缩,现代方案)
如果使用 Web 技术栈,推荐直接用 File.slice() + 并发上传,无需压缩:
const CHUNK_SIZE = 10 * 1024 * 1024; // 10MB per chunk
const file = document.getElementById('fileInput').files[0];
const totalChunks = Math.ceil(file.size / CHUNK_SIZE);
async function uploadChunk(index) {
const start = index * CHUNK_SIZE;
const end = Math.min(start + CHUNK_SIZE, file.size);
const chunk = file.slice(start, end);
const formData = new FormData();
formData.append('chunk', chunk);
formData.append('index', index);
formData.append('totalChunks', totalChunks);
formData.append('fileName', file.name);
await fetch('/api/upload/chunk', {
method: 'POST',
body: formData
});
}
// 并发上传(控制并发数避免阻塞)
async function uploadAll() {
const concurrency = 3;
let currentIndex = 0;
async function worker() {
while (currentIndex < totalChunks) {
const idx = currentIndex++;
await uploadChunk(idx);
}
}
const workers = Array(concurrency).fill(0).map(() => worker());
await Promise.all(workers);
console.log('Upload complete');
}
后端需支持接收分片并合并,或使用 OSS 的分片上传 API(见下文)。
✅ 最佳实践:直接使用阿里云 OSS 分片上传(强烈推荐)
如果你最终目的是存储到大文件,不要通过 ECS 中转上传到本地再处理,而是让客户端或中间件直传阿里云 OSS,并利用其原生分片上传功能。
OSS SDK 分片上传示例(Java)
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, file);
putObjectRequest.setPartSize(10 * 1024 * 1024); // 10MB
ossClient.putObject(putObjectRequest);
OSS SDK 分片上传示例(Python)
import oss2
auth = oss2.Auth('AccessKeyId', 'AccessKeySecret')
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'your-bucket')
with open('large_file.zip', 'rb') as f:
result = bucket.init_multipart_upload('object_key')
upload_id = result.upload_id
parts = []
part_size = 10 * 1024 * 1024 # 10MB
offset = 0
while True:
data = f.read(part_size)
if not data:
break
part_number = len(parts) + 1
part = bucket.upload_part(object_key, upload_id, part_number, data)
parts.append(part)
offset += len(data)
bucket.complete_multipart_upload(object_key, upload_id, parts)
✅ 优势:
- 无需修改 ECS 任何配置
- 支持断点续传、并发上传、自动重试
- 官方稳定维护,安全性高
📌 总结建议
| 场景 | 推荐方案 |
|---|---|
| 可修改服务端配置 | 调整 Nginx/PHP/Java 等 max_body_size |
| 不可改服务端 + 小团队 | Python/Shell 分卷压缩 + 循环上传 |
| 面向公网用户 + 大文件 | 前端 JS 分片上传 或 直传 OSS 分片上传 |
| 企业级应用 | 全程使用阿里云 OSS 分片上传 API |
💡 最后提醒:无论采用哪种方式,务必对上传路径做权限校验、病毒扫描、格式白名单检查,防止恶意文件注入。
如需具体某一种语言的完整代码模板,可告知你的技术栈(Java/Python/Node.js/Go 等),我可提供可直接运行的示例。
CLOUD云枢