Jquery中文网 www.jquerycn.cn
Jquery中文网 >  后端编程  >  Go语言  >  正文 go实现上传和下载excel接口

go实现上传和下载excel接口

发布时间:2021-04-15   编辑:www.jquerycn.cn
jquery中文网为您提供go实现上传和下载excel接口等资源,欢迎您收藏本站,我们将为您提供最新的go实现上传和下载excel接口资源
编写html文件

<html>
<head>
	<title>下载excel文件</title>
</head>

<body>
	<form enctype="multipart/form-data" action="http://127.0.0.1:8080/upload" method="POST">
	<input type="file" name="uploadfile" />
	<input type="submit" value="上传" />
	</form>
	<form enctype="multipart/form-data" action="http://127.0.0.1:8080/download" method="GET">
		<input type="submit" value="下载" />
	</form>
</body>
</html>

html效果如下图,
上传地址为:http://127.0.0.1:8080/upload
下载地址为:http://127.0.0.1:8080/download

iris mvc框架实现接口,文件目录结构如下图


// 定义控制器
type controller struct {
	Ctx iris.Context
}

// localhost:8080 返回上传页面
func (c *controller) Get() mvc.Result {
	return mvc.View{
		Name: "upload.html",
	}
}

// localhost:8080/upload 处理上传的excel文件
func (c *controller) PostUpload() {
	// 默认能上传文件的大小为32MB,可以通过 iris.WithPostMaxMemory(maxSize) 设置,
	// 比如10MB = 10 * 1024 * 1024 =maxSize,iris.WithPostMaxMemory(maxSize)
	// 3个参数,1是文件句柄,2是文件头,3是错误信息
	f, info, err := c.Ctx.FormFile("uploadfile")
	if err != nil {
		c.Ctx.StatusCode(iris.StatusInternalServerError)
		c.Ctx.HTML("1:Error while uploading: <b>"   err.Error()   "</b>")
		return
	}
	defer f.Close()

	// 获取原文件名字
	fname := info.Filename
	// 创建1个相同名字的文件,存放在upload目录里面
	// 假定本地已经有名字为 upload 的目录,没有的话会报错
	out, err := os.OpenFile("./upload/" fname, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		c.Ctx.StatusCode(iris.StatusInternalServerError)
		c.Ctx.HTML("controller.PostUpload error="   err.Error())
		return
	}
	defer out.Close()

	io.Copy(out, f)


	// 读取excel表格的数据
	//re, err := excelize.OpenFile("./upload/"   fname)
	//if err != nil {
	//	log.Println("读取表格数据错误:", err)
	//	return
	//}
	//
	 获取行数,[][]string 类型返回值
	//rows := re.GetRows("Sheet1")
	//for _, row := range rows {
	//	// 用 " | " 间隔拼接每一行数据
	//	str := "| "
	//	for _, val := range row {
	//		str  = val   " | "
	//	}
	//	fmt.Println(str)
	//}
}

// localhost:8080/download 生成excel文件下载下来
func (c *controller) GetDownload() {
	file := excelize.NewFile()
	// 1个单元格1个单元格添加
	file.SetCellValue("Sheet1", "A1", "工号")
	file.SetCellValue("Sheet1", "B1", "姓名")
	file.SetCellValue("Sheet1", "C1", "性别")
	file.SetCellValue("Sheet1", "D1", "部门")
	file.SetCellValue("Sheet1", "E1", "职业")
	// 1行添加
	row := []interface{}{123456, "川普", "男", "有关部", "美利坚同志"}
	file.SetSheetRow("Sheet1", "A2", &row) // 传递切片指针

	// 暂存再 tmp 目录,之后再删掉
	file.SaveAs("./tmp/test.xlsx")
	defer os.Remove("./tmp/test.xlsx")

	f, err := os.Open("./tmp/test.xlsx")
	if err != nil {
		c.Ctx.HTML("controller.GetDownload.os.Open error="   err.Error())
		return
	}
	defer f.Close()

	// 将文件读取出来
	data, err := ioutil.ReadAll(f)
	if err != nil {
		c.Ctx.HTML("controller.GetDownload.ioutil.ReadAll error="   err.Error())
		return
	}
	// 设置头信息:Content-Disposition ,消息头指示回复的内容该以何种形式展示,
	// 是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地
	// Content-Disposition: inline
	// Content-Disposition: attachment
	// Content-Disposition: attachment; filename="filename.后缀"
	// 第一个参数或者是inline(默认值,表示回复中的消息体会以页面的一部分或者
	// 整个页面的形式展示),或者是attachment(意味着消息体应该被下载到本地;
	// 大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名,
	// 假如它存在的话)。
	c.Ctx.Header("Content-Disposition",
		`attachment; filename="test.xlsx"`)
	c.Ctx.Write(data)
}
main文件

const maxSize = 10 * 1024 * 1024 //10MB

func main() {
	app := iris.New()
	// 注册模版文件
	html := iris.HTML("./views", ".html")
	// 每次连接都重新加载模板,调试时可以打开,上线必须关掉
	html.Reload(true)
	app.RegisterView(html)
	
	// 加载日志模块和异常恢复模块
	app.Use(logger.New())
	app.Use(recover.New())
	
	// 注册上传和下载控制器
	mvc.New(app.Party("/")).Handle(&controller{})

	// 监听8080端口,上传的文件最大为10MB
	app.Run(iris.Addr(":8080"), iris.WithPostMaxMemory(maxSize))
}

启动测试,如下图




上传和下载,表单内数据,上传的文件展示图

日志信息:

Now listening on: http://localhost:8080
Application started. Press CTRL C to shut down.
[INFO] 2019/09/10 13:59 200 1.071158ms 127.0.0.1 GET /
[INFO] 2019/09/10 14:00 200 18.833548ms 127.0.0.1 GET /download
[INFO] 2019/09/10 14:01 200 17.423613ms 127.0.0.1 POST /upload
到此这篇关于“go实现上传和下载excel接口”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
Go学习笔记:接口实现与指针
go 获取函数地址_Go语言基础--接口浅析
Go接口(Interface)的使用方法
Go 语言到底适合干什么?
Go 语言接口
基于类型系统的面向对象编程语言Go
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
golang检测结构体是否实现了接口的方法
2020-10-18Go语言接口

[关闭]