# package multipart
`import "mime/multipart"`
multipart實現了MIME的multipart解析,參見[RFC 2046](http://tools.ietf.org/html/rfc2046)。該實現適用于HTTP([RFC 2388](http://tools.ietf.org/html/rfc2388))和常見瀏覽器生成的multipart主體。
## Index
* [type File](#File)
* [type FileHeader](#FileHeader)
* [func (fh \*FileHeader) Open() (File, error)](#FileHeader.Open)
* [type Part](#Part)
* [func (p \*Part) FileName() string](#Part.FileName)
* [func (p \*Part) FormName() string](#Part.FormName)
* [func (p \*Part) Read(d []byte) (n int, err error)](#Part.Read)
* [func (p \*Part) Close() error](#Part.Close)
* [type Form](#Form)
* [func (f \*Form) RemoveAll() error](#Form.RemoveAll)
* [type Reader](#Reader)
* [func NewReader(r io.Reader, boundary string) \*Reader](#NewReader)
* [func (r \*Reader) ReadForm(maxMemory int64) (f \*Form, err error)](#Reader.ReadForm)
* [func (r \*Reader) NextPart() (\*Part, error)](#Reader.NextPart)
* [type Writer](#Writer)
* [func NewWriter(w io.Writer) \*Writer](#NewWriter)
* [func (w \*Writer) FormDataContentType() string](#Writer.FormDataContentType)
* [func (w \*Writer) Boundary() string](#Writer.Boundary)
* [func (w \*Writer) SetBoundary(boundary string) error](#Writer.SetBoundary)
* [func (w \*Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)](#Writer.CreatePart)
* [func (w \*Writer) CreateFormField(fieldname string) (io.Writer, error)](#Writer.CreateFormField)
* [func (w \*Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)](#Writer.CreateFormFile)
* [func (w \*Writer) WriteField(fieldname, value string) error](#Writer.WriteField)
* [func (w \*Writer) Close() error](#Writer.Close)
### Examples
* [NewReader](#example-NewReader)
## type [File](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L142 "View Source")
```
type File interface {
io.Reader
io.ReaderAt
io.Seeker
io.Closer
}
```
File是一個接口,實現了對一個multipart信息中文件記錄的訪問。它的內容可以保持在內存或者硬盤中,如果保持在硬盤中,底層類型就會是\*os.File。
## type [FileHeader](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L122 "View Source")
```
type FileHeader struct {
Filename string
Header textproto.MIMEHeader
// 內含隱藏或非導出字段
}
```
FileHeader描述一個multipart請求的(一個)文件記錄的信息。
### func (\*FileHeader) [Open](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L131 "View Source")
```
func (fh *FileHeader) Open() (File, error)
```
Open方法打開并返回其關聯的文件。
## type [Part](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L28 "View Source")
```
type Part struct {
// 主體的頭域,如果存在,是按Go的http.Header風格標準化的,如"foo-bar"改變為"Foo-Bar"。
// 有一個特殊情況,如果"Content-Transfer-Encoding"頭的值是"quoted-printable"。
// 該頭將從本map中隱藏,而主體會在調用Read時透明的解碼。
Header textproto.MIMEHeader
// 內含隱藏或非導出字段
}
```
Part代表multipart主體的單獨一個記錄。
### func (\*Part) [FileName](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L68 "View Source")
```
func (p *Part) FileName() string
```
返回Part?的Content-Disposition?頭的文件名參數。
### func (\*Part) [FormName](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L54 "View Source")
```
func (p *Part) FormName() string
```
如果p的Content-Disposition頭值為"form-data",則返回名字參數;否則返回空字符串。
### func (\*Part) [Read](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L131 "View Source")
```
func (p *Part) Read(d []byte) (n int, err error)
```
Read方法讀取一個記錄的主體,也就是其頭域之后到下一記錄之前的部分。
### func (\*Part) [Close](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L200 "View Source")
```
func (p *Part) Close() error
```
## type [Form](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L100 "View Source")
```
type Form struct {
Value map[string][]string
File map[string][]*FileHeader
}
```
Form是一個解析過的multipart表格。它的File參數部分保存在內存或者硬盤上,可以使用\*FileHeader類型屬性值的Open方法訪問。它的Value?參數部分保存為字符串,兩者都以屬性名為鍵。
### func (\*Form) [RemoveAll](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L106 "View Source")
```
func (f *Form) RemoveAll() error
```
刪除Form關聯的所有臨時文件。
## type [Reader](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L208 "View Source")
```
type Reader struct {
// 內含隱藏或非導出字段
}
```
Reader是MIME的multipart主體所有記錄的迭代器。Reader的底層會根據需要解析輸入,不支持Seek。
### func [NewReader](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L90 "View Source")
```
func NewReader(r io.Reader, boundary string) *Reader
```
函數使用給出的MIME邊界和r創建一個multipart讀取器。
邊界一般從信息的"Content-Type"?頭的"boundary"屬性獲取。可使用mime.ParseMediaType函數解析這種頭域。
Example
```
msg := &mail.Message{
Header: map[string][]string{
"Content-Type": []string{"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)
}
}
```
Output:
```
Part "one": "A section"
Part "two": "And another"
```
### func (\*Reader) [ReadForm](https://github.com/golang/go/blob/master/src/mime/multipart/formdata.go#L23 "View Source")
```
func (r *Reader) ReadForm(maxMemory int64) (f *Form, err error)
```
ReadForm解析整個multipart信息中所有Content-Disposition頭的值為"form-data"的記錄。它會把最多maxMemory字節的文件記錄保存在內存里,其余保存在硬盤的臨時文件里。
### func (\*Reader) [NextPart](https://github.com/golang/go/blob/master/src/mime/multipart/multipart.go#L222 "View Source")
```
func (r *Reader) NextPart() (*Part, error)
```
NextPart返回multipart的下一個記錄或者返回錯誤。如果沒有更多記錄會返回io.EOF。
## type [Writer](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L18 "View Source")
```
type Writer struct {
// 內含隱藏或非導出字段
}
```
Writer類型用于生成multipart信息。
### func [NewWriter](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L26 "View Source")
```
func NewWriter(w io.Writer) *Writer
```
NewWriter函數返回一個設定了一個隨機邊界的Writer,數據寫入w。
### func (\*Writer) [FormDataContentType](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L67 "View Source")
```
func (w *Writer) FormDataContentType() string
```
方法返回w對應的HTTP multipart請求的Content-Type的值,多以multipart/form-data起始。
### func (\*Writer) [Boundary](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L34 "View Source")
```
func (w *Writer) Boundary() string
```
方法返回該Writer的邊界。
### func (\*Writer) [SetBoundary](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L43 "View Source")
```
func (w *Writer) SetBoundary(boundary string) error
```
SetBoundary方法重寫Writer默認的隨機生成的邊界為提供的boundary參數。方法必須在創建任何記錄之前調用,boundary只能包含特定的ascii字符,并且長度應在1-69字節之間。
### func (\*Writer) [CreatePart](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L84 "View Source")
```
func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)
```
CreatePart方法使用提供的header創建一個新的multipart記錄。該記錄的主體應該寫入返回的Writer接口。調用本方法后,任何之前的記錄都不能再寫入。
### func (\*Writer) [CreateFormField](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L134 "View Source")
```
func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)
```
CreateFormField方法使用給出的屬性名調用CreatePart方法。
### func (\*Writer) [CreateFormFile](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L123 "View Source")
```
func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)
```
CreateFormFile是CreatePart方法的包裝,?使用給出的屬性名和文件名創建一個新的form-data頭。
### func (\*Writer) [WriteField](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L142 "View Source")
```
func (w *Writer) WriteField(fieldname, value string) error
```
WriteField方法調用CreateFormField并寫入給出的value。
### func (\*Writer) [Close](https://github.com/golang/go/blob/master/src/mime/multipart/writer.go#L153 "View Source")
```
func (w *Writer) Close() error
```
Close方法結束multipart信息,并將結尾的邊界寫入底層io.Writer接口。
- 庫
- package achive
- package tar
- package zip
- package bufio
- package builtin
- package bytes
- package compress
- package bzip2
- package flate
- package gzip
- package lzw
- package zlib
- package container
- package heap
- package list
- package ring
- package crypto
- package aes
- package cipher
- package des
- package dsa
- package ecdsa
- package elliptic
- package hmac
- package md5
- package rand
- package rc4
- package rsa
- package sha1
- package sha256
- package sha512
- package subtle
- package tls
- package x509
- package pkix
- package database
- package sql
- package driver
- package encoding
- package ascii85
- package asn1
- package base32
- package base64
- package binary
- package csv
- package gob
- package hex
- package json
- package pem
- package xml
- package errors
- package expvar
- package flag
- package fmt
- package go
- package doc
- package format
- package parser
- package printer
- package hash
- package adler32
- package crc32
- package crc64
- package fnv
- package html
- package template
- package image
- package color
- package palette
- package draw
- package gif
- package jpeg
- package png
- package index
- package suffixarray
- package io
- package ioutil
- package log
- package syslog
- package math
- package big
- package cmplx
- package rand
- package mime
- package multipart
- package net
- package http
- package cgi
- package cookiejar
- package fcgi
- package httptest
- package httputil
- package pprof
- package mail
- package rpc
- package jsonrpc
- package smtp
- package textproto
- package url
- package os
- package exec
- package signal
- package user
- package path
- package filepath
- package reflect
- package regexp
- package runtime
- package cgo
- package debug
- package pprof
- package race
- package sort
- package strconv
- package strings
- package sync
- package atomic
- package text
- package scanner
- package tabwriter
- package template
- package time
- package unicode
- package utf16
- package utf8
- package unsafe