Echo框架 文件上传

使用 Go Echo框架处理上传文件时,我们需要在控制器(controller)中通过 echo.Context 上下文对象的 FormFile 函数获取用户上传的文件。

 

1. 服务端代码

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"

	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

// 处理上传文件的控制器
func upload(c echo.Context) error {
	//-----------
	// 介绍演示如何处理文件上传
	//-----------

	// 通过FormFile函数获取客户端上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		return err
	}
	
	// 打开用户上传的文件
	src, err := file.Open()
	if err != nil {
		return err
	}
	defer src.Close()

	// 创建目标文件,就是我们打算把用户上传的文件保存到什么地方
	// file.Filename 参数指的是我们以用户上传的文件名,作为目标文件名,也就是服务端保存的文件名跟用户上传的文件名一样
	dst, err := os.Create(file.Filename)
	if err != nil {
		return err
	}
	defer dst.Close()

	// 这里将用户上传的文件复制到服务端的目标文件
	if _, err = io.Copy(dst, src); err != nil {
		return err
	}

	return c.HTML(http.StatusOK, fmt.Sprintf("<p>文件上传成功: %s</p>", file.Filename))
}

func main() {
	e := echo.New()
    
    // 设置静态资源中间件, public目录保存静态资源
	e.Static("/", "public")
	
	// 注册路由
	e.POST("/upload", upload)

	e.Logger.Fatal(e.Start(":1323"))
}

 

2. html 代码

文件名:public/index.html。

在本地创建一个 public 目录, 保存 index.html 代码。

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Single file upload</title>
</head>
<body>
<h1>上传文件演示</h1>

<form action="/upload" method="post" enctype="multipart/form-data">
    文件: <input type="file" name="file"><br><br>
    <input type="submit" value="上传文件">
</form>
</body>
</html>

在 Go Echo框架中,中间件(Middleware)指的是可以拦截 http请求-响应 生命周期的特殊函数。在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个中间件执行。中间件常见的应用场景如下:请求限速、api接口签名处理、权限校验、统一错误处理。