©
本文档使用
php.cn手册 发布
import "mime/multipart"
概述
索引
例子
Package multipart实现了RFC 2046中定义的MIME多部分解析。
对于HTTP(RFC 2388)和由流行浏览器生成的多部分机构来说,这个实现就足够了。
变量
type File
type FileHeader
func (fh *FileHeader) Open() (File, error)
type Form
func (f *Form) RemoveAll() error
type Part
func (p *Part) Close() error
func (p *Part) FileName() string
func (p *Part) FormName() string
func (p *Part) Read(d []byte) (n int, err error)
type Reader
func NewReader(r io.Reader, boundary string) *Reader
func (r *Reader) NextPart() (*Part, error)
func (r *Reader) ReadForm(maxMemory int64) (*Form, error)
type Writer
func NewWriter(w io.Writer) *Writer
func (w *Writer) Boundary() string
func (w *Writer) Close() error
func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)
func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)
func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)
func (w *Writer) FormDataContentType() string
func (w *Writer) SetBoundary(boundary string) error
func (w *Writer) WriteField(fieldname, value string) error
NewReader
formdata.go multipart.go writer.go
如果消息表单数据太大而无法处理,则ErrMessageTooLarge由ReadForm返回。
var ErrMessageTooLarge = errors.New("multipart: message too large")
文件是访问多部分消息的文件部分的接口。其内容可以存储在内存中或磁盘上。如果存储在磁盘上,则文件的基础具体类型将是* os.File。
type File interface { io.Reader io.ReaderAt io.Seeker io.Closer}
FileHeader描述多部分请求的文件部分。
type FileHeader struct { Filename string Header textproto.MIMEHeader Size int64 // contains filtered or unexported fields}
func (fh *FileHeader) Open() (File, error)
打开并返回FileHeader的关联文件。
表单是一个解析的多部分表单。它的File部分存储在内存中或磁盘上,并可通过* FileHeader的Open方法访问。其Value部分以字符串形式存储。两者都以字段名称为关键字。
type Form struct { Value map[string][]string File map[string][]*FileHeader}
func (f *Form) RemoveAll() error
RemoveAll删除与表单关联的所有临时文件。
零件表示多部分机构中的单个零件。
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" // // As a special case, if the "Content-Transfer-Encoding" header // has a value of "quoted-printable", that header is instead // hidden from this map and the body is transparently decoded // during Read calls. Header textproto.MIMEHeader // contains filtered or unexported fields}
func (p *Part) Close() error
func (p *Part) FileName() string
FileName返回零件的Content-Disposition标题的文件名参数。
func (p *Part) FormName() string
如果p有一个类型为“form-data”的Content-Disposition,FormName将返回name参数。否则,它返回空字符串。
func (p *Part) Read(d []byte) (n int, err error)
Read读取零件的正文,在其标题之后和下一部分(如果有)开始之前。
Reader是MIME多部分主体中的部分迭代器。Reader的底层解析器根据需要使用它的输入。寻求不支持。
type Reader struct { // contains filtered or unexported fields}
func NewReader(r io.Reader, boundary string) *Reader
NewReader使用给定的MIME边界从r创建新的多部分读取器读取。
边界通常从消息的“Content-Type”头部的“边界”参数获得。使用mime.ParseMediaType来解析这些标题。
package mainimport ("fmt""io""io/ioutil""log""mime""mime/multipart""net/mail""strings")func main() { 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 := ioutil.ReadAll(p)if err != nil { log.Fatal(err)} fmt.Printf("Part %q: %q\n", p.Header.Get("Foo"), slurp)}}}
func (r *Reader) NextPart() (*Part, error)
NextPart返回多部分中的下一部分或错误。当没有更多的零件时,返回错误io.EOF。
func (r *Reader) ReadForm(maxMemory int64) (*Form, error)
ReadForm解析整个多部分消息,其部分具有“form-data”的内容处置。它在内存中存储最大内存字节数+ 10MB(为非文件部分保留)。无法存储在内存中的文件将以临时文件的形式存储在磁盘上。如果所有非文件部分都不能存储在内存中,它将返回ErrMessageTooLarge。
Writer生成多部分消息。
type Writer struct { // contains filtered or unexported fields}
func NewWriter(w io.Writer) *Writer
NewWriter返回一个新的具有随机边界的多部分写入器,写入w。
func (w *Writer) Boundary() string
Boundary返回 Writer的边界。
func (w *Writer) Close() error
关闭完成多部分消息并将尾部边界结束行写入输出。
func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)
CreateFormField使用给定的字段名称调用带有标题的CreatePart。
func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)
CreateFormFile是CreatePart的一个便捷包装。它使用提供的字段名称和文件名创建一个新的表单数据标题。
func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)
CreatePart使用提供的标题创建一个新的多部分部分。该部分的主体应写入返回的Writer。调用CreatePart之后,可能不再写入任何以前的部分。
func (w *Writer) FormDataContentType() string
FormDataContentType返回具有该Writer边界的HTTP multipart / form-data的Content-Type。
func (w *Writer) SetBoundary(boundary string) error
SetBoundary用显式值覆盖Writer的默认随机生成边界分隔符。
必须在创建任何部件之前调用SetBoundary,可能只包含某些ASCII字符,并且必须非空且最多70个字节。
func (w *Writer) WriteField(fieldname, value string) error
WriteField调用CreateFormField,然后写入给定的值。