首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

多部分 | mime/multipart

  • 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

文件包

变量

如果消息表单数据太大而无法处理,则 ErrMessageTooLarge 由 ReadForm 返回。

代码语言:javascript
复制
var ErrMessageTooLarge = errors.New("multipart: message too large")

文件是访问多部分消息的文件部分的接口。其内容可以存储在内存中或磁盘上。如果存储在磁盘上,则文件的基础具体类型将是* os.File。

代码语言:javascript
复制
type File interface {
        io.Reader
        io.ReaderAt
        io.Seeker
        io.Closer
}

type FileHeader(查看源文件)

FileHeader 描述多部分请求的文件部分。

代码语言:javascript
复制
type FileHeader struct {
        Filename string
        Header   textproto.MIMEHeader
        Size     int64
        //包含已过滤或未导出的字段
}

func (*FileHeader) Open(查看源文件)

代码语言:javascript
复制
func (fh *FileHeader) Open() (File, error)

打开并返回 FileHeader 的关联文件。

表单是一个解析的多部分表单。它的 File 部分存储在内存中或磁盘上,并可通过 * FileHeader的Open 方法访问。其 Value 部分以字符串形式存储。两者都以字段名称为关键字。

代码语言:javascript
复制
type Form struct {
        Value map[string][]string
        File  map[string][]*FileHeader
}

func (*Form) RemoveAll(查看源文件)

代码语言:javascript
复制
func (f *Form) RemoveAll() error

RemoveAll 删除与表单关联的所有临时文件。

零件表示多部分机构中的单个零件。

代码语言:javascript
复制
type Part struct {
        //正文的带有标准化的键的标题(如果有的话)
         //以与Go http.Request标头相同的方式。
         //例如,“foo-bar”将大小写改为“Foo-Bar”
        //
         //如果是“Content-Transfer-Encoding”标题就作为一种特殊情况,
         //值为“quoted-printable”,而该标题则应该在里面
         //隐藏在此地图中,并且正文被透明地解码
         //在Read调用期间
        Header textproto.MIMEHeader
        //包含已过滤或未导出的字段
}

func (*Part) Close(查看源文件)

代码语言:javascript
复制
func (p *Part) Close() error

func (*Part) FileName(查看源文件)

代码语言:javascript
复制
func (p *Part) FileName() string

FileName 返回零件的 Content-Disposition 标题的文件名参数。

func (*Part) FormName(查看源文件)

代码语言:javascript
复制
func (p *Part) FormName() string

如果p有一个类型为 “form-data” 的 Content-Disposition,FormName 将返回 name 参数。否则,它返回空字符串。

func (*Part) Read(查看源文件)

代码语言:javascript
复制
func (p *Part) Read(d []byte) (n int, err error)

Read 读取零件的正文,在其标题之后和下一部分(如果有)开始之前。

Reader 是 MIME 多部分主体中的部分迭代器。Reader 的底层解析器根据需要使用它的输入。寻求不支持。

代码语言:javascript
复制
type Reader struct {
        //包含已过滤或未导出的字段
}

func NewReader(查看源文件)

代码语言:javascript
复制
func NewReader(r io.Reader, boundary string) *Reader

NewReader 使用给定的 MIME 边界从 r 创建新的多部分读取器读取。

边界通常从消息的 “Content-Type” 头部的“边界”参数获得。使用 mime.ParseMediaType 来解析这些标题。

示例

代码语言:javascript
复制
package main

import (
	"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 (*Reader) NextPart(查看源文件)

代码语言:javascript
复制
func (r *Reader) NextPart() (*Part, error)

NextPart 返回多部分中的下一部分或错误。当没有更多的零件时,返回错误 io.EOF。

func (*Reader) ReadForm(查看源文件)

代码语言:javascript
复制
func (r *Reader) ReadForm(maxMemory int64) (*Form, error)

ReadForm 解析整个多部分消息,其部分具有 “form-data” 的内容处置。它在内存中存储最大内存字节数+ 10MB(为非文件部分保留)。无法存储在内存中的文件将以临时文件的形式存储在磁盘上。如果所有非文件部分都不能存储在内存中,它将返回 ErrMessageTooLarge 。

Writer 生成多部分消息。

代码语言:javascript
复制
type Writer struct {
        // contains filtered or unexported fields
}

func NewWriter(查看源文件)

代码语言:javascript
复制
func NewWriter(w io.Writer) *Writer

NewWriter 返回一个新的具有随机边界的多部分写入器,写入 w 。

func (*Writer) Boundary(查看源文件)

代码语言:javascript
复制
func (w *Writer) Boundary() string

Boundary 返回 Writer 的边界。

func (*Writer) Close(查看源文件)

代码语言:javascript
复制
func (w *Writer) Close() error

关闭完成多部分消息并将尾部边界结束行写入输出。

func (*Writer) CreateFormField(查看源文件)

代码语言:javascript
复制
func (w *Writer) CreateFormField(fieldname string) (io.Writer, error)

CreateFormField 使用给定的字段名称调用带有标题的 CreatePart 。

func (*Writer) CreateFormFileSource

代码语言:javascript
复制
func (w *Writer) CreateFormFile(fieldname, filename string) (io.Writer, error)

CreateFormFile是CreatePart的一个便捷包装。它使用提供的字段名称和文件名创建一个新的表单数据标题。

func (*Writer) CreatePartSource

代码语言:javascript
复制
func (w *Writer) CreatePart(header textproto.MIMEHeader) (io.Writer, error)

CreatePart使用提供的标题创建一个新的多部分部分。该部分的主体应写入返回的Writer。调用CreatePart之后,可能不再写入任何以前的部分。

func (*Writer) FormDataContentTypeSource

代码语言:javascript
复制
func (w *Writer) FormDataContentType() string

FormDataContentType返回具有该Writer边界的HTTP multipart / form-data的Content-Type。

func (*Writer) SetBoundarySource

代码语言:javascript
复制
func (w *Writer) SetBoundary(boundary string) error

SetBoundary用显式值覆盖Writer的默认随机生成边界分隔符。

必须在创建任何部件之前调用SetBoundary,可能只包含某些ASCII字符,并且必须非空且最多70个字节。

func (*Writer) WriteFieldSource

代码语言:javascript
复制
func (w *Writer) WriteField(fieldname, value string) error

WriteField调用CreateFormField,然后写入给定的值。

扫码关注腾讯云开发者

领取腾讯云代金券