Spec-Zone.ru › Go

Пакет multipart

  • import "mime/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>.

Индекс

  • Переменные
  • тип File
  • тип FileHeader
  • функция (fh *FileHeader) Open() (File, error)
  • тип Form
  • функция (f *Form) RemoveAll() error
  • тип Part
  • функция (p *Part) Close() error
  • функция (p *Part) FileName() string
  • функция (p *Part) FormName() string
  • функция (p *Part) Read(d []byte) (n int, err error)
  • тип Reader
  • функция NewReader(r io.Reader, boundary string) *Reader
  • функция (r *Reader) NextPart() (*Part, error)
  • функция (r *Reader) NextRawPart() (*Part, error)
  • функция (r *Reader) ReadForm(maxMemory int64) (*Form, error)
  • тип Writer
  • функция NewWriter(w io.Writer) *Writer
  • функция (w *Writer) Boundary() string
  • функция (w *Writer) Close() error
  • функция (w *Writer) CreateFormField(fieldname string) (io.Writer, error)
  • функция (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)
  • функция (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)
  • функция (w *Writer) FormDataContentType() string
  • функция (w *Writer) SetBoundary(boundary string) error
  • функция (w *Writer) WriteField(fieldname, value string) error

Примеры

NewReader

Файлы пакета

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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API