← 返回生产场景
📁 文件上传与存储
图片/视频/OSS/分片上传/断点续传/CDN/防盗链
☁️为什么用 OSS 不存本地基础
| 维度 | 存本地 | 对象存储(OSS/S3) |
| 容器化 | ❌ 容器重启数据丢 | ✅ 独立持久化 |
| 扩容 | ❌ 磁盘有限 | ✅ 弹性扩容 |
| CDN加速 | ❌ 要自己搭 | ✅ 一键绑定CDN |
| 访问 | 要走应用服务器(占带宽) | ✅ 独立URL,不占应用带宽 |
📤大文件分片上传 + 断点续传高频
上传1GB视频,网络断了要重头来?分片上传:文件切成小块(如5MB一片),逐片上传,断了从断点继续。
// 分片上传流程
// 1. 前端:File.slice(0, 5MB) 切成 N 片
// 2. 前端:每片单独上传 POST /api/upload/chunk
// 3. 后端:存到临时目录 upload/{fileId}/{chunkIndex}
// 4. 全部上传完 → 前端调 POST /api/upload/merge
// 5. 后端:按 chunkIndex 顺序合并 → 传到 OSS
// 断点续传:上传前先问后端"哪些片已经传了"
// GET /api/upload/status?fileId=xxx&totalChunks=200
// 返回已上传的 chunkIndex 列表 → 前端跳过已传的
public UploadStatus getUploadStatus(String fileId) {
File dir = new File("/tmp/upload/" + fileId);
if (!dir.exists()) return new UploadStatus(Collections.emptyList());
// 返回已上传的分片列表
return new UploadStatus(Arrays.asList(dir.list()));
}
🔒防盗链
别人直接用你的图片URL,白嫖你的带宽。防盗链让只有你的网站能加载。
// OSS 防盗链配置
// 方案1:Referer白名单(只允许来自你域名的请求)
// 方案2:签名URL(URL带过期时间,过期了访问不了)
public String generateSignedUrl(String objectKey) {
// 生成一个1小时有效的签名URL
Date expiration = new Date(System.currentTimeMillis() + 3600000);
return ossClient.generatePresignedUrl(bucket, objectKey, expiration).toString();
}
生产场景 · 文件上传与存储 · 全栈资料库