Documentation
¶
Overview ¶
multipartパッケージは、RFC 2046で定義されているMIMEマルチパートの解析を実装します。
この実装は、HTTP(RFC 2388)と一般的なブラウザが生成するマルチパートボディに対して十分です。
制限 ¶
悪意のある入力に対する保護として、このパッケージは処理するMIMEデータのサイズに制限を設けています。
Reader.NextPart と Reader.NextRawPart は、パート内のヘッダーの数を10000に制限し、Reader.ReadForm はすべての FileHeaders内のヘッダーの合計数を10000に制限します。 これらの制限は、GODEBUG=multipartmaxheaders=<values>の設定で調整できます。
さらに、Reader.ReadFormはフォーム内のパートの数を1000に制限します。 この制限は、GODEBUG=multipartmaxparts=<value>の設定で調整できます。
Index ¶
- Variables
- type File
- type FileHeader
- type Form
- type Part
- type Reader
- type 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
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrMessageTooLarge = errors.New("multipart: message too large")
ErrMessageTooLargeは、メッセージフォームデータが処理するには大きすぎる場合、ReadFormによって返されます。
Functions ¶
This section is empty.
Types ¶
type File ¶
Fileは、マルチパートメッセージのファイル部分にアクセスするためのインターフェースです。 その内容はメモリに保存されるか、またはディスクに保存されます。 ディスクに保存されている場合、Fileの基礎となる具体的な型は*os.Fileになります。
type FileHeader ¶
type FileHeader struct { Filename string Header textproto.MIMEHeader Size int64 // contains filtered or unexported fields }
FileHeaderは、マルチパートリクエストのファイル部分を記述します。
func (*FileHeader) Open ¶
func (fh *FileHeader) Open() (File, error)
Openは、FileHeader に関連付けられたFileを開き、それを返します。
type Form ¶
type Form struct { Value map[string][]string File map[string][]*FileHeader }
Formは解析されたマルチパートフォームです。 ファイルパートはメモリまたはディスクに保存され、 *FileHeader のOpenメソッドを通じてアクセス可能です。 Valueパートは文字列として保存されます。 両方ともフィールド名でキー化されます。
type Part ¶
type Part struct { // ボディのヘッダー(存在する場合)は、Goのhttp.Requestヘッダーと同様に // キーが正規化されています。例えば、"foo-bar"は"Foo-Bar"に変更されます。 Header textproto.MIMEHeader // contains filtered or unexported fields }
Partは、マルチパートボディの単一の部分を表します。
func (*Part) FileName ¶
FileNameは、Part のContent-Dispositionヘッダーのfilenameパラメータを返します。 空でない場合、filenameはfilepath.Base(プラットフォーム依存)を通過してから返されます。
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
Readerは、MIMEマルチパートボディ内のパートを反復処理するためのものです。 Readerの基礎となるパーサーは、必要に応じて入力を消費します。シークはサポートされていません。
func NewReader ¶
NewReaderは、指定されたMIME境界を使用してrから読み取る新しいマルチパート Reader を作成します。
境界は通常、メッセージの"Content-Type"ヘッダーの"boundary"パラメータから取得します。 そのようなヘッダーを解析するには、mime.ParseMediaType を使用します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/io" "github.com/shogo82148/std/log" "github.com/shogo82148/std/mime" "github.com/shogo82148/std/mime/multipart" "github.com/shogo82148/std/net/mail" "github.com/shogo82148/std/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 := io.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) NextPart ¶
NextPartは、マルチパートの次のパートまたはエラーを返します。 パートがこれ以上ない場合、エラー io.EOF が返されます。
特別なケースとして、"Content-Transfer-Encoding"ヘッダーの値が "quoted-printable"である場合、そのヘッダーは代わりに隠され、 ボディはRead呼び出し中に透明にデコードされます。
func (*Reader) NextRawPart ¶ added in v1.14.0
NextRawPartは、マルチパートの次のパートまたはエラーを返します。 パートがこれ以上ない場合、エラー io.EOF が返されます。
Reader.NextPart とは異なり、"Content-Transfer-Encoding: quoted-printable"に対する特別な処理はありません。
type Writer ¶
type Writer struct {
// contains filtered or unexported fields
}
Writerはマルチパートメッセージを生成します。
func (*Writer) CreateFormField ¶
CreateFormFieldは、与えられたフィールド名を使用してヘッダーを作成し、 Writer.CreatePart を呼び出します。
func (*Writer) CreateFormFile ¶
CreateFormFileは、Writer.CreatePart の便利なラッパーです。これは、 提供されたフィールド名とファイル名で新しいform-dataヘッダーを作成します。
func (*Writer) CreatePart ¶
CreatePartは、提供されたヘッダーを持つ新しいマルチパートセクションを作成します。 パートのボディは、返された Writer に書き込むべきです。 CreatePartを呼び出した後、以前のパートにはもう書き込むことができません。
func (*Writer) FormDataContentType ¶
FormDataContentTypeは、この Writer のBoundaryを持つHTTP multipart/form-dataのContent-Typeを返します。
func (*Writer) SetBoundary ¶ added in v1.1.0
SetBoundaryは、Writer のデフォルトのランダムに生成された 境界セパレータを明示的な値で上書きします。
SetBoundaryはパートが作成される前に呼び出す必要があり、特定のASCII文字のみを 含むことができ、非空であり、最大で70バイトの長さでなければなりません。
func (*Writer) WriteField ¶
WriteFieldは Writer.CreateFormField を呼び出し、その後で与えられた値を書き込みます。