Метод http.Request.ParseMultipartForm

Метод ParseMultipartForm принадлежит структуре http.Request и используется для разбора тела HTTP запроса с типом содержимого multipart/form-data. В качестве параметра он принимает максимальный размер данных формы в байтах, которые будут сохранены в памяти. Остальная часть данных будет записана во временный файл. Метод автоматически вызывает ParseForm, если тот еще не был вызван, и заполняет поля Form и PostForm, а также добавляет в MultipartForm данные о загруженных файлах.

Синтаксис

goerr := r.ParseMultipartForm(maxMemory)

где r - указатель на http.Request, maxMemory - максимальный объем памяти в байтах, выделяемый для хранения данных формы. В случае успеха метод возвращает nil, иначе - ошибку.

Пример с обычными полями формы

Рассмотрим пример, где клиент отправляет форму с текстовыми полями и файлом:

gopackage main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  if r.Method == http.MethodPost {
    err := r.ParseMultipartForm(10 << 20) // 10 MB
    if err != nil {
      http.Error(w, "Failed to parse form", http.StatusBadRequest)
      return
    }

    name := r.FormValue("name")
    email := r.PostFormValue("email")

    fmt.Printf("Name: %s, Email: %s\n", name, email)
  }
}

func main() {
  http.HandleFunc("/upload", handler)
  http.ListenAndServe(":8080", nil)
}

Пример с загрузкой файла

Получим данные о загруженном файле с помощью поля MultipartForm:

gopackage main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  if r.Method == http.MethodPost {
    err := r.ParseMultipartForm(10 << 20) // 10 MB
    if err != nil {
      http.Error(w, "Failed to parse form", http.StatusBadRequest)
      return
    }

    fileHeaders := r.MultipartForm.File["file"]
    if len(fileHeaders) > 0 {
      fileHeader := fileHeaders[0]
      fmt.Printf("Filename: %s, Size: %d\n", fileHeader.Filename, fileHeader.Size)
    }
  }
}

func main() {
  http.HandleFunc("/upload", handler)
  http.ListenAndServe(":8080", nil)
}

Пример с несколькими файлами

Обработаем несколько загруженных файлов одновременно:

gopackage main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  if r.Method == http.MethodPost {
    err := r.ParseMultipartForm(10 << 20) // 10 MB
    if err != nil {
      http.Error(w, "Failed to parse form", http.StatusBadRequest)
      return
    }

    files := r.MultipartForm.File["files"]
    for i, fileHeader := range files {
      fmt.Printf("File %d: %s, Size: %d\n", i+1, fileHeader.Filename, fileHeader.Size)
    }
  }
}

func main() {
  http.HandleFunc("/upload", handler)
  http.ListenAndServe(":8080", nil)
}

Смотрите также

  • функцию http.Request.ParseForm,
    которая разбирает application/x-www-form-urlencoded данные
  • функцию http.Request.FormValue,
    которая возвращает значение поля формы по имени
  • функцию http.Request.PostFormValue,
    которая возвращает значение поля только из тела запроса
  • функцию url.Values,
    которая используется для хранения и работы с параметрами формы