表单、post数据和上传文件可以使用以下上下文的方法检索。

  1. // FormValueDefault returns a single parsed form value by its "name",
  2. // including both the URL field's query parameters and the POST or PUT form data.
  3. // FormValueDefault按“名称”返回一个解析后的表单值,
  4. // 包括URL字段的查询参数和POST或PUT表单数据。
  5. //
  6. // Returns the "def" if not found.
  7. // 如果没有找到,返回“def”。
  8. FormValueDefault(name string, def string) string
  9. // FormValue returns a single parsed form value by its "name",
  10. // including both the URL field's query parameters and the POST or PUT form data.
  11. // FormValue按其“名称”返回单个解析后的表单值,
  12. // 包括URL字段的查询参数和POST或PUT表单数据。
  13. FormValue(name string) string
  14. // FormValues returns the parsed form data, including both the URL
  15. // field's query parameters and the POST or PUT form data.
  16. // FormValues返回解析后的表单数据,包括两个URL
  17. // 字段的查询参数和POST或PUT表单数据。
  18. //
  19. // The default form's memory maximum size is 32MB, it can be changed by the
  20. // `iris.WithPostMaxMemory` configurator at
  21. // main configuration passed on `app.Run`'s second argument.
  22. //默认表单的最大内存大小是32MB,它可以通过
  23. / / `iris.WithPostMaxMemory`WithPostMaxMemory的配置器
  24. //通过app传递主配置。运行的第二个参数。
  25. //
  26. // NOTE: A check for nil is necessary.
  27. //注意:检查nil是必要的。
  28. FormValues() map[string][]string
  29. // PostValueDefault returns the parsed form data from POST, PATCH,
  30. // or PUT body parameters based on a "name".
  31. // PostValueDefault从POST、PATCH、
  32. // 或根据“名字”输入body参数。
  33. //
  34. // If not found then "def" is returned instead.
  35. // 如果没有找到,则返回“def”。
  36. PostValueDefault(name string, def string) string
  37. // PostValue returns the parsed form data from POST, PATCH,
  38. // or PUT body parameters based on a "name"
  39. // PostValue从POST、PATCH、
  40. //或根据“名称”输入body参数
  41. PostValue(name string) string
  42. // PostValueTrim returns the parsed form data from POST, PATCH,
  43. // or PUT body parameters based on a "name", without trailing spaces.
  44. // PostValueTrim从POST、PATCH、
  45. // 或基于“名称”放置主体参数,尾部不带空格。
  46. PostValueTrim(name string) string
  47. // PostValueInt returns the parsed form data from POST, PATCH,
  48. // or PUT body parameters based on a "name", as int.
  49. // PostValueInt从POST、PATCH、
  50. //或基于“名称”放入主体参数,如int。
  51. //
  52. // If not found returns -1 and a non-nil error.
  53. // 如果没有找到,返回-1和一个非nil错误
  54. PostValueInt(name string) (int, error)
  55. // PostValueIntDefault returns the parsed form data from POST, PATCH,
  56. // or PUT body parameters based on a "name", as int.
  57. // PostValueIntDefault返回从POST、PATCH、
  58. //或基于“名称”放入主体参数,如int。
  59. //
  60. // If not found returns or parse errors the "def".
  61. // 如果没有找到,则返回或解析“def”错误。
  62. PostValueIntDefault(name string, def int) int
  63. // PostValueInt64 returns the parsed form data from POST, PATCH,
  64. // or PUT body parameters based on a "name", as float64.
  65. //
  66. // If not found returns -1 and a no-nil error.
  67. PostValueInt64(name string) (int64, error)
  68. // PostValueInt64Default returns the parsed form data from POST, PATCH,
  69. // or PUT body parameters based on a "name", as int64.
  70. //
  71. // If not found or parse errors returns the "def".
  72. PostValueInt64Default(name string, def int64) int64
  73. // PostValueInt64Default returns the parsed form data from POST, PATCH,
  74. // or PUT body parameters based on a "name", as float64.
  75. //
  76. // If not found returns -1 and a non-nil error.
  77. PostValueFloat64(name string) (float64, error)
  78. // PostValueInt64Default returns the parsed form data from POST, PATCH,
  79. // or PUT body parameters based on a "name", as float64.
  80. //
  81. // If not found or parse errors returns the "def".
  82. PostValueFloat64Default(name string, def float64) float64
  83. // PostValueInt64Default returns the parsed form data from POST, PATCH,
  84. // or PUT body parameters based on a "name", as bool.
  85. //
  86. // If not found or value is false, then it returns false, otherwise true.
  87. PostValueBool(name string) (bool, error)
  88. // PostValues returns all the parsed form data from POST, PATCH,
  89. // or PUT body parameters based on a "name" as a string slice.
  90. //
  91. // The default form's memory maximum size is 32MB, it can be changed by the
  92. // `iris.WithPostMaxMemory` configurator at
  93. // main configuration passed on `app.Run`'s second argument.
  94. PostValues(name string) []string
  95. // FormFile returns the first uploaded file that received from the client.
  96. //
  97. // The default form's memory maximum size is 32MB, it can be changed by the
  98. // `iris.WithPostMaxMemory` configurator at
  99. // main configuration passed on `app.Run`'s second argument.
  100. FormFile(key string) (multipart.File, *multipart.FileHeader, error)

多部分/ Urlencoded形式


  1. func main() {
  2. app := iris.Default()
  3. app.Post("/form_post", func(ctx iris.Context) {
  4. message := ctx.FormValue("message")
  5. nick := ctx.FormValueDefault("nick", "anonymous")
  6. ctx.JSON(iris.Map{
  7. "status": "posted",
  8. "message": message,
  9. "nick": nick,
  10. })
  11. })
  12. app.Listen(":8080")
  13. }

另一个例子:查询+发布表单


  1. POST /post?id=1234&page=1 HTTP/1.1
  2. Content-Type: application/x-www-form-urlencoded
  3. name=manu&message=this_is_great
  1. func main() {
  2. app := iris.Default()
  3. app.Post("/post", func(ctx iris.Context) {
  4. id := ctx.URLParam("id")
  5. page := ctx.URLParamDefault("page", "0")
  6. name := ctx.FormValue("name")
  7. message := ctx.FormValue("message")
  8. // or `ctx.PostValue` for POST, PUT & PATCH-only HTTP Methods.
  9. app.Logger().Infof("id: %s; page: %s; name: %s; message: %s",
  10. id, page, name, message)
  11. })
  12. app.Listen(":8080")
  13. }
  1. id: 1234; page: 1; name: manu; message: this_is_great

上传文件


Iris Context提供了一个上传文件的助手(将文件从请求文件数据保存到主机系统的硬盘)。阅读更多有关上下文的内容。Context.UploadFormFiles下面的方法。

UploadFormFiles上传任何从客户端接收到的文件到系统物理位置“destDirectory”。

第二个可选参数“before”让调用者有机会修改*miltipart。在保存到磁盘之前,它可以用来根据当前请求更改文件的名称,所有FileHeader的选项都可以更改。如果在将文件保存到磁盘之前不需要使用此功能,则可以忽略它。

注意,它不检查请求体是否流化。

如果由于操作系统的权限或net/http导致至少一个新文件无法创建,则返回复制的长度为int64和not nil错误。net/http.ErrMissingFile 如果没有收到文件,错误文件。

如果你想要手动接收和管理文件,你可以使用Context.FormFile。然后创建一个适合您需要的复制函数,下面是通用用法。

默认表单的最大内存大小是32MB,它可以通过iris#WithPostMaxMemory配置器在主配置中对app.Run的第二个参数进行更改。

  1. UploadFormFiles(destDirectory string,
  2. before ...func(Context, *multipart.FileHeader)) (n int64, err error)

实例代码:

  1. const maxSize = 5 << 20 // 5MB
  2. func main() {
  3. app := iris.Default()
  4. app.Post("/upload", iris.LimitRequestBodySize(maxSize), func(ctx iris.Context) {
  5. //
  6. // UploadFormFiles
  7. // uploads any number of incoming files ("multiple" property on the form input).
  8. //
  9. // The second, optional, argument
  10. // can be used to change a file's name based on the request,
  11. // at this example we will showcase how to use it
  12. // by prefixing the uploaded file with the current user's ip.
  13. ctx.UploadFormFiles("./uploads", beforeSave)
  14. })
  15. app.Listen(":8080")
  16. }
  17. func beforeSave(ctx iris.Context, file *multipart.FileHeader) {
  18. ip := ctx.RemoteAddr()
  19. // make sure you format the ip in a way
  20. // that can be used for a file name (simple case):
  21. ip = strings.Replace(ip, ".", "_", -1)
  22. ip = strings.Replace(ip, ":", "_", -1)
  23. // you can use the time.Now, to prefix or suffix the files
  24. // based on the current time as well, as an exercise.
  25. // i.e unixTime := time.Now().Unix()
  26. // prefix the Filename with the $IP-
  27. // no need for more actions, internal uploader will use this
  28. // name to save the file into the "./uploads" folder.
  29. file.Filename = ip + "-" + file.Filename
  30. }

怎样用curl:

  1. curl -X POST http://localhost:8080/upload \
  2. -F "files[]=@./myfile.zip" \
  3. -F "files[]=@./mysecondfile.zip" \
  4. -H "Content-Type: multipart/form-data"

更多的例子可以在https://github.com/kataras/iris/tree/master/_examples/request-bodyhttps://github.com/kataras/iris/tree/master/_examples/filesserver找到。