Метод http.Request.ParseMultipartForm
Метод ParseMultipartForm принадлежит структуре http.Request и используется для разбора тела HTTP запроса с типом содержимого multipart/form-data. В качестве параметра он принимает максимальный размер данных формы в байтах, которые будут сохранены в памяти. Остальная часть данных будет записана во временный файл. Метод автоматически вызывает ParseForm, если тот еще не был вызван, и заполняет поля Form и PostForm, а также добавляет в MultipartForm данные о загруженных файлах.
Синтаксис
err := r.ParseMultipartForm(maxMemory)
где r - указатель на http.Request, maxMemory - максимальный объем памяти в байтах, выделяемый для хранения данных формы. В случае успеха метод возвращает nil, иначе - ошибку.
Пример с обычными полями формы
Рассмотрим пример, где клиент отправляет форму с текстовыми полями и файлом:
package 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:
package 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)
}
Пример с несколькими файлами
Обработаем несколько загруженных файлов одновременно:
package 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,
которая используется для хранения и работы с параметрами формы