Golang Gin中SaveUploadedFile无法正常保存.tgz文件求助
问题排查:Gin SaveUploadedFile保存.tgz文件损坏体积缩水
使用gin.Context的SaveUploadedFile方法保存multipart上传文件时,图片文件处理正常,但.tgz类型文件保存后体积大幅缩小(原文件33KB,保存后仅14KB),导致文件损坏。相关代码如下:
multipartFileHeader, err := c.FormFile("file") if err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ "message": "No file is received", }) return "", err } fmt.Println("file size") fmt.Println(multipartFileHeader.Size) extension := filepath.Ext(multipartFileHeader.Filename) newFileName := uuid.New().String() + extension localTargetFilePath := "/tmp/" + newFileName if err := c.SaveUploadedFile(multipartFileHeader, localTargetFilePath); err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "message": "Unable to save the file", }) return "", err }
可能的排查方向
- 前端上传编码问题:确认前端是否以二进制模式传输.tgz文件。若前端误用文本编码(如UTF-8)发送二进制文件,会导致字节转换丢失,引发文件损坏。需保证请求的Content-Type为
multipart/form-data,且文件以二进制流形式上传。 - 替换Gin方法手动验证:Gin的SaveUploadedFile底层依赖
io.Copy,可手动实现文件保存流程对比测试:
若手动保存正常,说明当前Gin版本可能存在特定场景bug,尝试升级Gin到最新稳定版。file, err := multipartFileHeader.Open() if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to open uploaded file"}) return "", err } defer file.Close() outFile, err := os.Create(localTargetFilePath) if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to create local file"}) return "", err } defer outFile.Close() _, err = io.Copy(outFile, file) if err != nil { c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"message": "Failed to write file"}) return "", err } - 验证文件上传完整性:检查打印的
multipartFileHeader.Size是否与原文件大小一致。若Size值本身偏小,说明前端上传时文件未传输完整,需排查前端上传逻辑(如是否存在上传中断、分片上传未合并等问题)。 - 文件系统环境检查:确认/tmp目录有足够写入权限,且磁盘空间充足。虽然此类问题通常会直接报错,但也可排除文件系统自动压缩等特殊配置影响。
内容的提问来源于stack exchange,提问作者Rajesh Paul
相关产品推荐
相关产品推荐

