非常教程

Go参考手册

拟态 | mime

多部分 | 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

文件包

formdata.go multipart.go writer.go

变量

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

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

type 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
        //包含已过滤或未导出的字段
}

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

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

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

type 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(查看源文件)

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

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 返回零件的 Content-Disposition 标题的文件名参数。

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

func (p *Part) FormName() string

如果p有一个类型为 “form-data” 的 Content-Disposition,FormName 将返回 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 创建新的多部分读取器读取。

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

示例

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(查看源文件)

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

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

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

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

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

type Writer(查看源文件)

Writer 生成多部分消息。

type Writer struct {
        // contains filtered or unexported fields
}

func NewWriter(查看源文件)

func NewWriter(w io.Writer) *Writer

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

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

func (w *Writer) Boundary() string

Boundary 返回 Writer 的边界。

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

func (w *Writer) Close() error

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

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

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

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

func (*Writer) CreateFormFileSource

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

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

func (*Writer) CreatePartSource

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

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

func (*Writer) FormDataContentTypeSource

func (w *Writer) FormDataContentType() string

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

func (*Writer) SetBoundarySource

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

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

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

func (*Writer) WriteFieldSource

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

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

拟态 | mime相关

Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串