golang 文件上传处理

本文进行间的文件上传处理操作

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)
}


可以复制代码或者自己试一试

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值