企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
表单,提交的数据和上传的文件能够被检索到, 通过使用下面的 Context 的方法: ``` // FormValueDefault 按“名称”返回一个已解析的表单值, // 包括URL字段的查询参数和 POST 或 PUT 表单数据。 // // 如果找不到,则返回 "def" 。 FormValueDefault(name string, def string) string // FormValue 按“名称”返回一个已解析的表单值, // 包括URL字段的查询参数和 POST 或 PUT 表单数据。 FormValue(name string) string // FormValues 返回已解析的表单数据, 包括 URL // 字段的查询参数以及 POST 或 PUT 表单数据。 // // 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory` // 配置到 `app.Run` 的第二个参数去修改默认值。 // // 注意:必须检查 nil 。 FormValues() map[string][]string // PostValueDefault 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的数据。 // // 如果未找到,则返回 "def" 。 PostValueDefault(name string, def string) string // PostValue 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的数据。 PostValue(name string) string // PostValueTrim 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数不带空格的数据。 PostValueTrim(name string) string // PostValueInt 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 int 数据。 // // 如果未找到,则返回-1和非 nil 错误。 PostValueInt(name string) (int, error) // PostValueIntDefault 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 int 数据。 // // 如果未找到,则返回 "def" 。 PostValueIntDefault(name string, def int) int // PostValueInt64 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 int64(原文是 float64) 数据。 // // 如果未找到,则返回-1和非 nil 错误。 PostValueInt64(name string) (int64, error) // PostValueInt64Default 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 int64 数据。 // // 如果未找到,则返回 "def" 。 PostValueInt64Default(name string, def int64) int64 // PostValueFloat64 (原文是 PostValueInt64Default ) 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 float64 数据。 // // 如果未找到,则返回-1和非 nil 错误。 PostValueFloat64(name string) (float64, error) // PostValueFloat64Default (原文是 PostValueInt64Default ) 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 float64 数据。 // // 如果未找到,则返回 "def" 。 PostValueFloat64Default(name string, def float64) float64 // PostValueBool (原文是 PostValueInt64Default ) 通过名称来返回解析自 POST, PATCH, // 或者 PUT 主体参数的 bool 数据。 // // 如果未找到或 value 为 false,则返回 false,否则返回 true。 PostValueBool(name string) (bool, error) // PostValues 通过名称来返回所有解析自 POST, PATCH, // 或者 PUT 主体参数的 struct 数据。 // // 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory` // 配置到 `app.Run` 的第二个参数去修改默认值。 PostValues(name string) []string // FormFile 返回从客户端收到的第一个上载文件。 // // 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory` // 配置到 `app.Run` 的第二个参数去修改默认值。 FormFile(key string) (multipart.File, *multipart.FileHeader, error) ``` ## 多部分/Url 编码 表单 ``` func main() { app := iris.Default() app.Post("/form_post", func(ctx iris.Context) { message := ctx.FormValue("message") nick := ctx.FormValueDefault("nick", "anonymous") ctx.JSON(iris.Map{ "status": "posted", "message": message, "nick": nick, }) }) app.Run(iris.Addr(":8080")) } ``` ## 另一个示例: 查询 + 表单提交 ``` POST /post?id=1234&page=1 HTTP/1.1 Content-Type: application/x-www-form-urlencoded name=manu&message=this_is_great ``` ``` func main() { app := iris.Default() app.Post("/post", func(ctx iris.Context) { id := ctx.URLParam("id") page := ctx.URLParamDefault("page", "0") name := ctx.FormValue("name") message := ctx.FormValue("message") // 或者 `ctx.PostValue` for POST, PUT & PATCH-only HTTP 方法。 app.Logger().Infof("id: %s; page: %s; name: %s; message: %s", id, page, name, message) }) app.Run(iris.Addr(":8080")) } ``` ``` id: 1234; page: 1; name: manu; message: this_is_great ``` ## 文件上传 Iris 的 Context 提供了一个用于上传文件的辅助方法 (将文件从请求文件数据保存到主机系统的硬盘)。 阅读下面有关 `Context.UploadFormFiles` 方法的更多信息。 UploadFormFiles 从客户端将所有收到的文件上传到系统物理位置 "destDirectory"。 第二个可选参数 "before" 使调用者有机会在保存到磁盘之前修改 `*miltipart.FileHeader` ,它可以根据当前请求用于更改文件名, 所有 FileHeader的选项都可以被改变。如果在将文件保存到磁盘之前不需要使用此功能,则可以忽略它。 请注意,它不会检查请求主体是否流式传输 如果服务器未收到文件,如果是由于操作系统的权限或`net/http.ErrMissingFile`而无法创建至少一个新文件,则返回复制的长度为 int64,并返回一个不为零的错误。 如果要接收和接受文件并手动进行管理, 则可以改用`Context.FormFile`并创建适合你需要的复制功能,以下内容仅用于一般情况。 默认表单的内存最大大小为32MB, 可以通过传递 `iris.WithPostMaxMemory` 配置到 `app.Run` 的第二个参数去修改默认值。 ``` UploadFormFiles(destDirectory string, before ...func(Context, *multipart.FileHeader)) (n int64, err error) ``` 示例代码: ``` const maxSize = 5 << 20 // 5MB func main() { app := iris.Default() app.Post("/upload", iris.LimitRequestBodySize(maxSize), func(ctx iris.Context) { // // UploadFormFiles // 上传任意数量的文件 (表单中的 "multiple" 属性)。 // // 第二个可选参数 // 可用于根据请求更改文件的名称, // 在此示例中,我们将展示如何使用它 // 通过使用当前用户的ip作为上传文件的前缀。 ctx.UploadFormFiles("./uploads", beforeSave) }) app.Run(iris.Addr(":8080")) } func beforeSave(ctx iris.Context, file *multipart.FileHeader) { ip := ctx.RemoteAddr() // 确保你已经以某种方式格式化ip // 让人它可以用于命名文件 (简单案例): ip = strings.Replace(ip, ".", "_", -1) ip = strings.Replace(ip, ":", "_", -1) // 你也可以使用 time.Now 基于当前时间, // 为文件添加前缀或后缀,作为练习。 // i.e unixTime := time.Now().Unix() // 在文件名前加上 $IP- // 无需执行其他操作,内部上传器 // 将文件以此名称保存到 "./uploads" 文件夹中。 file.Filename = ip + "-" + file.Filename } ``` 如何 `curl`: ``` curl -X POST http://localhost:8080/upload \ -F "files[]=@./myfile.zip" \ -F "files[]=@./mysecondfile.zip" \ -H "Content-Type: multipart/form-data" ``` 可以在 https://github.com/kataras/iris/tree/master/_examples/http_request 中找到更多示例。