本文进行间的文件上传处理操作
1、使用http.Request的FormFile读取上传的文件,获取文件对象、文件头部信息
2、一般读取文件对象的内容,方便后面的存储或者其他处理
3、文件的头部信息中包含了文件的一些基本信息,包括文件名、文件大小等
http.Request的FormFile原型如下:
// FormFile returns the first file for the provided form key.
// FormFile calls ParseMultipartForm and ParseForm if necessary.
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) {
if r.MultipartForm == multipartByReader {
return nil, nil, errors.New("http: multipart handled by MultipartReader")
}
if r.MultipartForm == nil {
err := r.ParseMultipartForm(defaultMaxMemory)
if err != nil {
return nil, nil, err
}
}
if r.MultipartForm != nil && r.MultipartForm.File != nil {
if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
f, err := fhs[0].Open()
return f, fhs[0], err
}
}
return nil, nil, ErrMissingFile
}
三个返回值:
1、multipart.File 是文件对象
2、multipart.FileHeader文件头部包含了一些基本信息
// A FileHeader describes a file part of a multipart request.
type FileHeader struct {
Filename string //文件名
Header textproto.MIMEHeader //MIME信息
Size int64 //文件大小,单位bit
content []byte //文件内容,类型[]byte
tmpfile string //临时文件
}
下面是一个最基本的文件处理Demo:
package main
import(
"fmt"
"net/http"
"os"
)
func FileUploadHandler(w http.ResponseWriter,r *http.Request){
fmt.Println("开始文件上传处理")
file,header,err := r.FormFile("file")
if err != nil {
fmt.Println("文件获取错误")
return
}
// 读取文件内容
dataBuf := make([]byte,header.Size)
_,err = file.Read(dataBuf)
if err != nil {
fmt.Println("读取文件内容错误")
fmt.Println(err.Error())
return
}
// 文件存入本地
fileName := header.Filename
f, err := os.Create("./uploadFile/" + fileName)
if err != nil {
fmt.Println("文件创建错误")
fmt.Println(err.Error())
return
}
_,err = f.Write(dataBuf)
if err != nil {
fmt.Println("文件写入错误")
fmt.Println(err.Error())
return
}
fmt.Println("文件处理结束")
}
func main(){
http.HandleFunc("/upload",FileUploadHandler)
http.ListenAndServe(":9999",nil)
}
可以复制代码或者自己试一试