招聘GoFrame高级工程师,面议

125   /   0   /   0   /   0   /   发布于 116天前
输入搜索关键字... 框架介绍 加入我们 GF工具链 准备工作 快速开始(更新中) 代码质量 项目部署 WEB服务开发 开始使用 路由注册 请求输入 请求输出 Cookie Session 配置管理 错误处理 HTTP客户端 基本介绍 链式操作 使用示例 基本使用 文件上传 自定义Cookie 自定义Header 代理Proxy设置 请求信息打印 分页管理 WEB开发进阶 WEB开发高级 网络服务开发 常用开发模块 对象管理 调试模式 配置管理 资源管理 错误处理 日志管理 类型转换 数据校验 缓存管理 模板引擎 数据库ORM NoSQL Redis 功能模块列表 框架学习教程 框架开发案例 版本发布记录 FAQ常见问题 文件上传 GF支持非常方便的表单文件上传功能,并且HTTP客户端对上传功能进行了必要的封装并极大简化了上传功能调用。 注意哦:上传文件大小受到ghttp.Server的ClientMaxBodySize配置影响:https://godoc.org/github.com/gogf/gf/net/ghttp#ServerConfig 默认支持的上传文件大小为8MB。 服务端 https://github.com/gogf/gf/blob/master/.example/net/ghttp/client/upload/server.go package main import ( "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" ) // Upload uploads files to /tmp . func Upload(r *ghttp.Request) { files := r.GetUploadFiles("upload-file") names, err := files.Save("/tmp/") if err != nil { r.Response.WriteExit(err) } r.Response.WriteExit("upload successfully: ", names) } // UploadShow shows uploading simgle file page. func UploadShow(r *ghttp.Request) { r.Response.Write(` GF Upload File Demo
`) } // UploadShowBatch shows uploading multiple files page. func UploadShowBatch(r *ghttp.Request) { r.Response.Write(` GF Upload Files Demo
`) } func main() { s := g.Server() s.Group("/upload", func(group *ghttp.RouterGroup) { group.POST("/", Upload) group.ALL("/show", UploadShow) group.ALL("/batch", UploadShowBatch) }) s.SetPort(8199) s.Run() } 该服务端提供了3个接口: http://127.0.0.1:8199/upload/show 地址用于展示单个文件上传的H5页面; http://127.0.0.1:8199/upload/batch 地址用于展示多个文件上传的H5页面; http://127.0.0.1:8199/upload 接口用于真实的表单文件上传,该接口同时支持单个文件或者多个文件上传; 我们这里访问 http://127.0.0.1:8199/upload/show 选择需要上传的单个文件,提交之后可以看到文件上传成功到服务器上。 关键代码说明 我们在服务端可以通过r.GetUploadFiles方法获得上传的所有文件对象,也可以通过r.GetUploadFile获取单个上传的文件对象。 在r.GetUploadFiles("upload-file")中的参数"upload-file"为本示例中客户端上传时的表单文件域名称,开发者可以根据前后端约定在客户端中定义,以方便服务端接收表单文件域参数。 通过files.Save可以将上传的多个文件方便地保存到指定的目录下,并返回保存成功的文件名。如果是批量保存,只要任意一个文件保存失败,都将会立即返回错误。此外,Save方法的第二个参数支持随机自动命名上传文件。 通过group.POST("/", Upload)注册的路由仅支持POST方式访问。 客户端 单文件上传 https://github.com/gogf/gf/blob/master/.example/net/ghttp/client/upload/client.go package main import ( "fmt" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/os/glog" ) func main() { path := "/home/john/Workspace/Go/github.com/gogf/gf/version.go" r, e := ghttp.Post("http://127.0.0.1:8199/upload", "upload-file=@file:"+path) if e != nil { glog.Error(e) } else { fmt.Println(string(r.ReadAll())) r.Close() } } 注意到了吗?文件上传参数格式使用了 参数名=@file:文件路径 ,HTTP客户端将会自动解析文件路径对应的文件内容并读取提交给服务端。原本复杂的文件上传操作被gf进行了封装处理,用户只需要使用 @file:+文件路径 来构成参数值即可。其中,文件路径请使用本地文件绝对路径。 首先运行服务端程序之后,我们再运行这个上传客户端(注意修改上传的文件路径为本地真实文件路径),执行后可以看到文件被成功上传到服务器的指定路径下。 多文件上传 https://github.com/gogf/gf/blob/master/.example/net/ghttp/client/upload-batch/client.go package main import ( "fmt" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/os/glog" ) func main() { path1 := "/Users/john/Pictures/logo1.png" path2 := "/Users/john/Pictures/logo2.png" r, e := ghttp.Post( "http://127.0.0.1:8199/upload", fmt.Sprintf(`upload-file=@file:%s&upload-file=@file:%s`, path1, path2), ) if e != nil { glog.Error(e) } else { fmt.Println(string(r.ReadAll())) r.Close() } } 可以看到,多个文件上传提交参数格式为参数名=@file:xxx&参数名=@file:xxx...,也可以使用参数名[]=@file:xxx&参数名[]=@file:xxx...的形式。 首先运行服务端程序之后,我们再运行这个上传客户端(注意修改上传的文件路径为本地真实文件路径),执行后可以看到文件被成功上传到服务器的指定路径下。 自定义上传文件名称 很简单,修改FileName属性即可。 s := g.Server() s.BindHandler("/upload", func(r *ghttp.Request) { file := r.GetUploadFile("TestFile") if file == nil { r.Response.Write("empty file") return } file.Filename = "MyCustomFileName.txt" fileName, err := file.Save(gfile.TempDir()) if err != nil { r.Response.Write(err) return } r.Response.Write(fileName) }) s.SetPort(8999) s.Run() 上一节:基本使用下一节:自定义Cookie Powered by GoFrame v1.9.3
  • 共 0 条回复
  • 需要登录 后方可回复, 如果你还没有账号请点击这里注册