Пакет multipart
Обзор
Пакет multipart реализует разбор MIME multipart, как определено в RFC 2046.
Реализация достаточна для HTTP (RFC 2388) и multipart-телов, генерируемых популярными браузерами.
Ограничения
Для защиты от вредоносных данных, этот пакет устанавливает ограничения на размер обрабатываемых MIME-данных.
Reader.NextPart и Reader.NextRawPart ограничивают количество заголовков в части до 10000, а Reader.ReadForm ограничивает общее количество заголовков во всех FileHeaders до 10000. Эти ограничения могут быть изменены с помощью настройки GODEBUG=multipartmaxheaders=<values>.
Reader.ReadForm дополнительно ограничивает количество частей в форме до 1000. Это ограничение можно изменить, используя настройку GODEBUG=multipartmaxparts=<value>.
Индекс
Примеры
Файлы пакета
formdata.go multipart.go readmimeheader.go writer.go
Переменные
ErrMessageTooLarge возвращается функцией ReadForm, если данные формы сообщения слишком велики для обработки.
var ErrMessageTooLarge = errors.New("multipart: message too large") тип File
File — это интерфейс для доступа к файловой части multipart-сообщения. Его содержимое может храниться либо в памяти, либо на диске. Если хранится на диске, базовый тип File будет *os.File.
type File interface {
io.Reader
io.ReaderAt
io.Seeker
io.Closer
} тип FileHeader
FileHeader описывает файловую часть multipart-запроса.
type FileHeader struct {
Filename string
Header textproto.MIMEHeader
Size int64 // Go 1.9
// contains filtered or unexported fields
}
функция (*FileHeader) Open
func (fh *FileHeader) Open() (File, error)
Open открывает и возвращает ассоциированный с FileHeader файл.
тип Form
Form — это разобранная multipart-форма. Его файловые части хранятся либо в памяти, либо на диске и доступны через метод Open FileHeader. Его значения частей хранятся как строки. Оба ключируются по имени поля.
type Form struct {
Value map[string][]string
File map[string][]*FileHeader
}
функция (*Form) RemoveAll
func (f *Form) RemoveAll() error
RemoveAll удаляет все временные файлы, связанные с формой.
тип Part
Part представляет собой отдельную часть в multipart-теле.
type Part struct {
// The headers of the body, if any, with the keys canonicalized
// in the same fashion that the Go http.Request headers are.
// For example, "foo-bar" changes case to "Foo-Bar"
Header textproto.MIMEHeader
// contains filtered or unexported fields
}
функция (*Part) Close
func (p *Part) Close() error
функция (*Part) FileName
func (p *Part) FileName() string
FileName возвращает параметр имени файла заголовка Content-Disposition части. Если он не пустой, имя файла передается через filepath.Base (зависит от платформы) перед возвратом.
функция (*Part) FormName
func (p *Part) FormName() string
FormName возвращает параметр имени, если у p есть тип Content-Disposition "form-data". В противном случае возвращает пустую строку.
функция (*Part) Read
func (p *Part) Read(d []byte) (n int, err error)
Read считывает тело части после заголовков и до начала следующей части (если есть).
тип Reader
Reader — это итератор по частям в MIME multipart-теле. Базовый парсер Reader потребляет свой вход по мере необходимости. Поддержка поиска не предусмотрена.
type Reader struct {
// contains filtered or unexported fields
}
функция NewReader
func NewReader(r io.Reader, boundary string) *Reader
NewReader создаёт новый multipart-Reader, читающий из r с заданной границей MIME.
Граница обычно берётся из параметра "boundary" заголовка "Content-Type" сообщения. Используйте mime.ParseMediaType для разбора таких заголовков.
Пример
Код:
msg := &mail.Message{
Header: map[string][]string{
"Content-Type": {"multipart/mixed; boundary=foo"},
},
Body: strings.NewReader(
"--foo\r\nFoo: one\r\n\r\nA section\r\n" +
"--foo\r\nFoo: two\r\n\r\nAnd another\r\n" +
"--foo--\r\n"),
}
mediaType, params, err := mime.ParseMediaType(msg.Header.Get("Content-Type"))
if err != nil {
log.Fatal(err)
}
if strings.HasPrefix(mediaType, "multipart/") {
mr := multipart.NewReader(msg.Body, params["boundary"])
for {
p, err := mr.NextPart()
if err == io.EOF {
return
}
if err != nil {
log.Fatal(err)
}
slurp, err := io.ReadAll(p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Part %q: %q\n", p.Header.Get("Foo"), slurp)
}
}
Вывод:
Part "one": "A section" Part "two": "And another"
функция (*Reader) NextPart
func (r *Reader) NextPart() (*Part, error)
NextPart возвращает следующую часть в multipart или ошибку. Когда больше частей нет, возвращается ошибка io.EOF.
В качестве специального случая, если заголовок "Content-Transfer-Encoding" имеет значение "quoted-printable", этот заголовок скрывается, а тело прозрачно декодируется во время вызовов Read.
функция (*Reader) NextRawPart 1.14
func (r *Reader) NextRawPart() (*Part, error)
NextRawPart возвращает следующую часть в multipart или ошибку. Когда больше частей нет, возвращается ошибка io.EOF.
В отличие от Reader.NextPart, он не обрабатывает "Content-Transfer-Encoding: quoted-printable" особым образом.
функция (*Reader) ReadForm
func (r *Reader) ReadForm(maxMemory int64) (*Form, error)
ReadForm анализирует всё multipart-сообщение, чьи части имеют Content-Disposition "form-data". Он хранит до maxMemory байтов + 10 МБ (зарезервировано для не-файловых частей) в памяти. Файловые части, которые не могут быть сохранены в памяти, будут сохранены на диске во временных файлах. Он возвращает ErrMessageTooLarge, если все не-файловые части не могут быть сохранены в памяти.
тип Writer
Writer генерирует multipart-сообщения.
type Writer struct {
// contains filtered or unexported fields
}
функция NewWriter
func NewWriter(w io.Writer) *Writer
NewWriter возвращает новый multipart-Writer с случайной границей, записывающей в w.
функция (*Writer) Boundary
func (w *Writer) Boundary() string
Boundary возвращает границу Writer.
функция (*Writer) Close
func (w *Writer) Close() error
Close завершает multipart-сообщение и записывает конечную границу в выходной поток.
функция (*Writer) CreateFormField
func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)
CreateFormField вызывает Writer.CreatePart с заголовком, используя данное имя поля.
функция (*Writer) CreateFormFile
func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)
CreateFormFile — это удобная обертка вокруг Writer.CreatePart. Она создаёт новый заголовок form-data с указанным именем поля и именем файла.
функция (*Writer) CreatePart
func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)
CreatePart создаёт новую часть multipart с предоставленным заголовком. Тело части должно быть записано в возвращённый Writer. После вызова CreatePart к предыдущей части больше нельзя обращаться для записи.
функция (*Writer) FormDataContentType
func (w *Writer) FormDataContentType() string
FormDataContentType возвращает Content-Type для HTTP multipart/form-data с границей этого Writer.
функция (*Writer) SetBoundary 1.1
func (w *Writer) SetBoundary(boundary string) error
SetBoundary переопределяет стандартную, случайным образом сгенерированную границу Writer явным значением.
SetBoundary нужно вызвать до создания любых частей, может содержать только определённые символы ASCII, должна быть непустой и не длиннее 70 байт.
функция (*Writer) WriteField
func (w *Writer) WriteField(fieldname, value string) error
WriteField вызывает Writer.CreateFormField и затем записывает указанное значение.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/mime/multipart/