gongxiangp2/UPLOAD_LIMITS.md
2025-10-26 09:11:04 +08:00

192 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 上传大小限制说明
## 📊 当前配置
### 1. Next.js 服务器限制
**位置:** `next.config.js`
```javascript
experimental: {
serverActions: {
bodySizeLimit: '100mb' // ✅ 当前限制:100MB
}
}
```
### 2. 前端验证
**位置:** `components/UploadModal.tsx`
- ❌ **当前没有文件大小验证**
- ✅ 有文件类型验证(图片和ZIP)
- ✅ 显示文件大小
### 3. 其他可能的限制
#### Docker 容器
- ✅ 无特殊限制
#### 反向代理(如果使用)
- ⚠️ **需要注意:** 如果使用Nginx反向代理,默认限制是1MB
- 需要配置:`client_max_body_size 100m;`
#### FRP内网穿透
- ✅ FRP默认无大小限制
---
## 🔧 建议优化
### 1. 添加前端文件大小验证
在 `components/UploadModal.tsx` 中添加验证:
\`\`\`typescript
const MAX_PREVIEW_SIZE = 10 * 1024 * 1024; // 10MB
const MAX_ZIP_SIZE = 100 * 1024 * 1024; // 100MB
const handlePreviewChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0]
if (file) {
if (!file.type.startsWith('image/')) {
setError('请选择图片文件')
return
}
// 添加大小验证
if (file.size > MAX_PREVIEW_SIZE) {
setError('预览图片不能超过10MB')
return
}
setPreviewImage(file)
setPreviewUrl(URL.createObjectURL(file))
setError('')
}
}
const handleZipChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0]
if (file) {
if (!file.name.endsWith('.zip') && !file.name.endsWith('.rar')) {
setError('请选择压缩包文件(.zip 或 .rar)')
return
}
// 添加大小验证
if (file.size > MAX_ZIP_SIZE) {
setError(\`压缩包不能超过\${MAX_ZIP_SIZE / 1024 / 1024}MB\`)
return
}
setZipFile(file)
setError('')
}
}
\`\`\`
### 2. 添加上传进度显示
\`\`\`typescript
const [uploadProgress, setUploadProgress] = useState(0)
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
setError('')
// ... 验证代码 ...
setUploading(true)
try {
const formData = new FormData()
formData.append('previewImage', previewImage)
formData.append('zipFile', zipFile)
formData.append('productModel', productModel)
formData.append('sceneName', sceneName)
const xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', (e) => {
if (e.lengthComputable) {
const percentComplete = Math.round((e.loaded / e.total) * 100)
setUploadProgress(percentComplete)
}
})
xhr.addEventListener('load', () => {
if (xhr.status === 201) {
onSuccess()
onClose()
} else {
const data = JSON.parse(xhr.responseText)
setError(data.error || '上传失败')
}
setUploading(false)
})
xhr.addEventListener('error', () => {
setError('上传失败,请稍后重试')
setUploading(false)
})
xhr.open('POST', '/api/materials/upload')
xhr.send(formData)
} catch (error) {
console.error('Upload error:', error)
setError('上传失败,请稍后重试')
setUploading(false)
}
}
\`\`\`
### 3. 如果需要增加限制到更大
修改 `next.config.js`:
\`\`\`javascript
experimental: {
serverActions: {
bodySizeLimit: '500mb' // 增加到500MB
}
}
\`\`\`
---
## 📋 测试清单
- [ ] 测试上传小于10MB的预览图
- [ ] 测试上传10MB的预览图(应该成功)
- [ ] 测试上传大于10MB的预览图(应该被拒绝)
- [ ] 测试上传小于100MB的ZIP文件
- [ ] 测试上传100MB的ZIP文件(应该成功)
- [ ] 测试上传大于100MB的ZIP文件(应该被拒绝)
- [ ] 测试网络中断后重新上传
- [ ] 测试上传进度显示
---
## 🚨 注意事项
1. **网络超时**
- 大文件上传可能需要较长时间
- 建议设置合理的超时时间
- 考虑添加断点续传功能
2. **存储空间**
- NAS存储空间:`/mnt/tank/apps/youyidian-3d/uploads`
- 定期清理不需要的文件
- 监控磁盘使用情况
3. **S3存储**
- 预览图片存储在S3,有足够空间
- 注意S3的流量费用
4. **用户体验**
- 添加文件大小提示
- 显示上传进度
- 提供清晰的错误信息
---
**最后更新:** 2025-10-16
**当前限制:** 预览图无限制(建议10MB),ZIP文件100MB