表单,提交的数据和上传的文件能够被检索到, 通过使用下面的 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 中找到更多示例。