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语言接口