← 返回生产场景

📁 文件上传与存储

图片/视频/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(); }
生产场景 · 文件上传与存储 · 全栈资料库