
hertz文件相关
文件上传
包含文件上传和附带其他的信息
go
package main
import (
"context"
"fmt"
"io"
"os"
"path/filepath"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func uploadHandler(ctx context.Context, c *app.RequestContext) {
// ✅ 1. 获取上传的文件
fileHeader, err := c.FormFile("file")
if err != nil {
c.JSON(consts.StatusBadRequest, utils.H{
"error": "No file uploaded or invalid field name 'file': " + err.Error(),
})
return
}
// ✅ 2. 使用 c.FormValue 获取 multipart 中的文本字段
packageName := c.FormValue("package_name")
md5 := c.FormValue("md5")
// 日志输出
fmt.Printf("Uploading: %s\n", fileHeader.Filename)
fmt.Printf("Package Name: %s\n", packageName)
fmt.Printf("MD5: %s\n", md5)
// ✅ 3. 创建保存目录
saveDir := "./uploads"
if err := os.MkdirAll(saveDir, os.ModePerm); err != nil {
c.JSON(consts.StatusInternalServerError, utils.H{
"error": "Failed to create upload directory",
})
return
}
// 构建保存路径
savePath := filepath.Join(saveDir, fileHeader.Filename)
// ✅ 4. 打开上传的文件并保存
src, err := fileHeader.Open()
if err != nil {
c.JSON(consts.StatusInternalServerError, utils.H{
"error": "Failed to open uploaded file: " + err.Error(),
})
return
}
defer src.Close()
dst, err := os.Create(savePath)
if err != nil {
c.JSON(consts.StatusInternalServerError, utils.H{
"error": "Failed to create local file: " + err.Error(),
})
return
}
defer dst.Close()
_, err = io.Copy(dst, src)
if err != nil {
c.JSON(consts.StatusInternalServerError, utils.H{
"error": "Failed to save file content: " + err.Error(),
})
return
}
// ✅ 5. 返回成功响应
c.JSON(consts.StatusOK, utils.H{
"message": "File uploaded successfully",
"filename": fileHeader.Filename,
"package_name": packageName,
"md5": md5,
"saved_as": savePath,
"size": fileHeader.Size,
})
}
func main() {
// 创建 Hertz 服务器
h := server.New(
server.WithHostPorts(":8080"),
)
// 注册路由
h.POST("/upload", uploadHandler)
// 启动服务
fmt.Println("Server is running on http://localhost:8080")
h.Spin()
}
测试curl命令
shell
curl -X POST http://localhost:8080/upload \
-F "package_name=com.demo.app" \
-F "md5=a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4" \
-F "file=@test.apk" \
-H "Content-Type: multipart/form-data"