阿里云服务器限制单次上传100M,有没有推荐的分卷压缩上传方案?

阿里云服务器本身并没有全局性的“单次上传100M”硬性限制。你遇到的这个限制,通常来自以下几个层面之一:

  1. Web服务器配置:如 Nginx 的 client_max_body_size 或 Apache 的 LimitRequestBody。
  2. 应用层框架限制:如 Spring Boot 的 spring.servlet.multipart.max-file-size 或 PHP 的 upload_max_filesize / post_max_size。
  3. 前端JS限制:某些上传组件(如 Element UI、Ant Design)默认限制了单个文件体积。
  4. 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云枢 » 阿里云服务器限制单次上传100M,有没有推荐的分卷压缩上传方案?