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: " + err.Error() + "")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 //10MBfunc 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端口,上传的文件最大为10MBapp.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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部