...

パッケージ multipart

import "mime/multipart"
概要
目次

概要 ▾

multipart パッケージは,RFC 2046 で定義された MIME マルチパートのパースを実装します。

実装は, HTTP (RFC 2388) および一般的なブラウザによって生成されたマルチパートボディに対して十分です。

変数

ErrMessageTooLarge は,メッセージフォームデータが大きすぎて処理できない場合に ReadForm によって返されます。

var ErrMessageTooLarge = errors.New("multipart: message too large")

type File

File は,マルチパートメッセージのファイル部分にアクセスするためのインターフェースです。 その内容はメモリかディスクのどちらかに格納されます。 ディスクに格納されている場合, File の内部の具象型は *os.File になります。

type File interface {
    io.Reader
    io.ReaderAt
    io.Seeker
    io.Closer
}

type FileHeader

FileHeader は,マルチパートリクエストのファイル部分を記述します。

type FileHeader struct {
    Filename string
    Header   textproto.MIMEHeader
    Size     int64 // Go 1.9
    // エクスポートされていないフィールドがあります
}

func (*FileHeader) Open

func (fh *FileHeader) Open() (File, error)

Open は FileHeader に関連付けられている File を開いて返します。

type Form

Form は解析済みマルチパートフォームです。 その File 部分はメモリかディスクのどちらかに保存され, *FileHeader の Open メソッドを通してアクセス可能です。 その Value 部分は文字列として格納されます。 どちらもフィールド名でキー入力されています。

type Form struct {
    Value map[string][]string
    File  map[string][]*FileHeader
}

func (*Form) RemoveAll

func (f *Form) RemoveAll() error

RemoveAll は,フォームに関連付けられている一時ファイルをすべて削除します。

type Part

Part は,マルチパートボディ内の 1 つのパートを表します。

type Part struct {
    // もしあれば, Go の http.Request ヘッダと同じ方法でキーが正規化されたボディのヘッダ。
    // たとえば, "foo-bar" は大文字と小文字を "Foo-Bar" に変更します。
    //
    // 特別な場合として, "Content-Transfer-Encoding" ヘッダーの値が "quoted-printable" の場合,そのヘッダーは代わりにこのマップから隠され, Read 呼び出し中にボディは透過的にデコードされます。
    Header textproto.MIMEHeader
    // エクスポートされていないフィールドがあります
}

func (*Part) Close

func (p *Part) Close() error

func (*Part) FileName

func (p *Part) FileName() string

FileName は, Part の Content-Disposition ヘッダのファイル名パラメータを返します。

func (*Part) FormName

func (p *Part) FormName() string

FormName は,p が "form-data" 型の Content-Disposition を持つ場合,name パラメータを返します。 それ以外の場合は空の文字列を返します。

func (*Part) Read

func (p *Part) Read(d []byte) (n int, err error)

Read は,そのヘッダーの後で,次の部分があればそれが始まる前に,その部分の本体を読み取ります。

type Reader

Reader は, MIME マルチパートボディ内のパートに対する反復子です。 Reader の内部のパーサーは必要に応じてその入力を消費します。 シークはサポートされていません。

type Reader struct {
    // エクスポートされていないフィールドがあります
}

func NewReader

func NewReader(r io.Reader, boundary string) *Reader

NewReader は,与えられた MIME 境界を使って r から読み取る新しいマルチパート Reader を作成します。

boundary は通常,メッセージの "Content-Type" ヘッダの "boundary" パラメータから取得されます。 このようなヘッダを解析するには 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 := ioutil.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"

func (*Reader) NextPart

func (r *Reader) NextPart() (*Part, error)

NextPart は,マルチパートの次のパートまたはエラーを返します。 それ以上部品がなくなると,エラー io.EOF が返されます。

func (*Reader) ReadForm

func (r *Reader) ReadForm(maxMemory int64) (*Form, error)

ReadForm は,部分に "form-data" の Content-Disposition があるマルチパートメッセージ全体を解析します。 最大 maxMemory バイト + 10MB (ファイル以外の部分用に予約済み) をメモリに格納します。 メモリに保存できないファイル部分は,一時ファイルとしてディスクに保存されます。 ファイル以外の部分をすべてメモリに格納できない場合は, ErrMessageTooLarge を返します。

type Writer

Writer はマルチパートメッセージを生成します。

type Writer struct {
    // エクスポートされていないフィールドがあります
}

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter は,ランダムな境界を持つ新しいマルチパート Writer を w に書き込みます。

func (*Writer) Boundary

func (w *Writer) Boundary() string

Broundary は Writer の境界を返します。

func (*Writer) Close

func (w *Writer) Close() error

Close はマルチパートメッセージを終了し,末尾の境界線を出力に書き込みます。

func (*Writer) CreateFormField

func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)

CreateFormField は, fieldname を使用してヘッダー付きの CreatePart を呼び出します。

func (*Writer) CreateFormFile

func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)

CreateFormFile は CreatePart の便利なラッパーです。 fieldname と filename で新しいフォームデータヘッダーを作成します。

func (*Writer) CreatePart

func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)

CreatePart は,header を使って新しいマルチパートセクションを作成します。 パートの本体は返された Writer に書き込まれるべきです。 CreatePart を呼び出した後は,前の部分に書き込みができなくなります。

func (*Writer) FormDataContentType

func (w *Writer) FormDataContentType() string

FormDataContentType は,この Writer の Boundary を持つ HTTPmultipart/form-data の Content-Type を返します。

func (*Writer) SetBoundary 1.1

func (w *Writer) SetBoundary(boundary string) error

SetBoundary は, Writer のデフォルトのランダムに生成された境界区切り文字を明示的な値で上書きします。

SetBoundary は,パートが作成される前に呼び出す必要があり,特定の ASCII 文字のみを含めることができ,空ではなく,最大 70 バイトの長さでなければなりません。

func (*Writer) WriteField

func (w *Writer) WriteField(fieldname, value string) error

WriteField は CreateFormField を呼び出してから,value を書き込みます。