Skip to content
鼓励作者:欢迎打赏犒劳

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"

如有转载或 CV 的请标注本站原文地址