一架梯子,一头程序猿,仰望星空!

golang echo处理文件上传


本章介绍echo如何处理文件上传。
在控制器中主要通过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>