ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Gin文件上传下载实战从本地存储到OSS云端集成

Gin文件上传下载实战从本地存储到OSS云端集成 Gin文件上传下载实战从本地存储到OSS云端集成文章导语文件上传下载是Web开发的基础功能但在高并发、大文件场景下需要处理分片上传、断点续传、文件校验、安全防护等问题。本文基于Gin框架从本地存储到云端OSS构建完整的文件管理系统。一、基础文件上传funcUploadFile(c*gin.Context){file,header,err:c.Request.FormFile(file)iferr!nil{c.JSON(400,gin.H{msg:文件上传失败})return}deferfile.Close()// 安全检查ext:filepath.Ext(header.Filename)if!isAllowedExt(ext){c.JSON(400,gin.H{msg:不支持的文件类型})return}ifheader.SizemaxFileSize{c.JSON(400,gin.H{msg:文件大小超过限制})return}// 生成唯一文件名newName:uuid.New().String()ext savePath:filepath.Join(uploadDir,newName)dst,err:os.Create(savePath)iferr!nil{c.JSON(500,gin.H{msg:创建文件失败})return}deferdst.Close()if_,err:io.Copy(dst,file);err!nil{os.Remove(savePath)c.JSON(500,gin.H{msg:保存文件失败})return}c.JSON(200,gin.H{url:/files/newName,name:header.Filename,size:header.Size,})}二、大文件分片上传// 分片上传接口funcUploadChunk(c*gin.Context){uploadID:c.PostForm(upload_id)chunkIndex,_:strconv.Atoi(c.PostForm(chunk_index))totalChunks,_:strconv.Atoi(c.PostForm(total_chunks)file,_,err:c.Request.FormFile(file)iferr!nil{c.JSON(400,gin.H{msg:分片读取失败})return}deferfile.Close()chunkData,_:io.ReadAll(file)// 存储分片到临时目录chunkPath:filepath.Join(tempDir,fmt.Sprintf(%s_%d,uploadID,chunkIndex))os.WriteFile(chunkPath,chunkData,0644)c.JSON(200,gin.H{msg:分片上传成功,chunk:chunkIndex})}// 合并分片funcMergeChunks(c*gin.Context){varreqstruct{UploadIDstringjson:upload_idFileNamestringjson:file_nameTotalChunksintjson:total_chunks}c.ShouldBindJSON(req)ext:filepath.Ext(req.FileName)newName:uuid.New().String()ext finalPath:filepath.Join(uploadDir,newName)dst,_:os.Create(finalPath)deferdst.Close()fori:0;ireq.TotalChunks;i{chunkPath:filepath.Join(tempDir,fmt.Sprintf(%s_%d,req.UploadID,i))chunkData,_:os.ReadFile(chunkPath)dst.Write(chunkData)os.Remove(chunkPath)// 清理分片}c.JSON(200,gin.H{msg:合并完成,url:/files/newName})}三、文件下载与流式传输funcDownloadFile(c*gin.Context){filename:c.Param(filename)filePath:filepath.Join(uploadDir,filepath.Clean(filename))// 安全防止路径穿越if!strings.HasPrefix(filePath,uploadDir){c.JSON(403,gin.H{msg:禁止访问})return}// 设置下载头c.Header(Content-Disposition,fmt.Sprintf(attachment; filename%s,filename))c.Header(Content-Transfer-Encoding,binary)c.Header(Cache-Control,no-cache)c.File(filePath)}// 大文件流式下载支持Range请求funcStreamFile(c*gin.Context){filename:c.Param(filename)filePath:filepath.Join(uploadDir,filepath.Clean(filename))file,err:os.Open(filePath)iferr!nil{c.JSON(404,gin.H{msg:文件不存在})return}deferfile.Close()stat,_:file.Stat()c.Header(Accept-Ranges,bytes)http.ServeContent(c.Writer,c.Request,filename,stat.ModTime(),file)}四、阿里云OSS集成funcUploadToOSS(c*gin.Context){file,header,err:c.Request.FormFile(file)iferr!nil{c.JSON(400,gin.H{msg:文件读取失败})return}deferfile.Close()objectKey:fmt.Sprintf(uploads/%s/%s,time.Now().Format(2006/01),uuid.New().String())// OSS上传errossClient.PutObject(objectKey,file)iferr!nil{c.JSON(500,gin.H{msg:OSS上传失败})return}// 生成签名URLsignedURL,_:ossClient.SignURL(objectKey,oss.HTTPGet,3600)c.JSON(200,gin.H{url:signedURL,name:header.Filename,oss_key:objectKey,})}五、全文总结文件类型/大小校验是安全的基础分片上传解决大文件和弱网环境上传问题http.ServeContent自动处理Range请求OSS集成降低本地存储压力和带宽成本路径穿越防护确保文件系统安全六、技术进阶展望对象存储的多地域同步CDN加速与缓存策略图片/视频的实时转码处理参考文献Gin文件上传文档阿里云OSS Go SDK: https://github.com/aliyun/aliyun-oss-go-sdkGo multipart包文档AWS S3 Go SDK v2OWASP - File Upload Cheat Sheet
返回列表