golang 文件上传处理

本文介绍如何使用Go语言处理HTTP文件上传请求,通过http.Request的FormFile方法读取上传文件,并将其保存到本地的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


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

### Golang 实现获取与处理上传文件 #### 使用标准库实现单个文件上传 当构建Web服务时,有时需要提供上传文件的功能。下面展示了一个利用Go语言的标准库`net/http`来创建一个简单的HTTP服务器,并允许客户端上传文件的例子[^1]。 ```go package main import ( "fmt" "io" "net/http" "os" ) func uploadHandler(w http.ResponseWriter, r *http.Request) { file, handler, err := r.FormFile("file") if err != nil { fmt.Println("Error Retrieving the File") fmt.Println(err) return } defer file.Close() f, err := os.OpenFile("./uploads/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) fmt.Fprintf(w, "Successfully Uploaded!") } func setupRoutes() { http.HandleFunc("/upload", uploadHandler) http.ListenAndServe(":8080", nil) } func main() { setupRoutes() } ``` 此代码片段定义了一个名为`uploadHandler`的处理器函数用于接收POST请求中的文件数据;并通过调用`FormFile()`方法获得上传文件的对象及其元信息。之后打开一个新的本地文件准备写入接收到的数据,最后使用`io.Copy()`完成实际的数据复制操作[^3]。 #### 利用 Gin 框架简化开发过程 对于更复杂的项目来说,采用像Gin这样的第三方框架能够极大地提高效率。这里给出一段基于Gin框架实现相同功能——即接受来自用户的文件提交并将之保存至服务器端指定位置上的示例程序: ```go package main import ( "github.com/gin-gonic/gin" "log" "net/http" "path/filepath" ) func UploadSingleFile(c *gin.Context) { form, _ := c.MultipartForm() files := form.File["files"] for _, file := range files { log.Printf("Received file: %v\n", file.Filename) ext := filepath.Ext(file.Filename) log.Printf("File extension is :%s \n", ext) err := c.SaveUploadedFile(file, "./uploads/" + file.Filename) if err != nil { c.String(http.StatusBadRequest, fmt.Sprintf("error:%s", err.Error())) return } } c.JSON(http.StatusOK, gin.H{"message": "Files uploaded successfully"}) } func main() { r := gin.Default() r.POST("/upload", UploadSingleFile) r.Run(":9090") // listen and serve on 0.0.0.0:9090 } ``` 上述例子展示了如何借助于Gin内置的方法轻松地解析多部分表单(`MultipartForm`)并从中提取出所有被标记为`files[]`字段内的文件项。此外还运用了`filepath.Ext()`函数来取得每个文件对应的扩展名[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值