golang大文件上傳怎么實(shí)現(xiàn)

小億
212
2023-10-26 04:26:14

在Go語(yǔ)言中,可以使用net/http包來實(shí)現(xiàn)大文件上傳。下面是一個(gè)簡(jiǎn)單的示例:

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func uploadFile(w http.ResponseWriter, r *http.Request) {
	// 限制最大上傳文件大小
	r.ParseMultipartForm(32 << 20) // 32MB

	file, handler, err := r.FormFile("file")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	// 創(chuàng)建一個(gè)新文件用于保存上傳的文件
	f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	// 將上傳的文件內(nèi)容復(fù)制到新文件中
	io.Copy(f, file)

	fmt.Fprintf(w, "上傳成功")
}

func main() {
	http.HandleFunc("/upload", uploadFile)
	http.ListenAndServe(":8000", nil)
}

上述代碼創(chuàng)建了一個(gè)HTTP服務(wù)器,監(jiān)聽在localhost:8000上。當(dāng)客戶端發(fā)送一個(gè)POST請(qǐng)求到/upload路徑時(shí),服務(wù)器將接收到的文件保存到本地。

在客戶端發(fā)送請(qǐng)求時(shí),需要將要上傳的文件作為multipart/form-data類型的請(qǐng)求體中的一個(gè)字段進(jìn)行傳遞,字段的名稱為file??梢允褂?code>curl命令進(jìn)行測(cè)試:

$ curl -F "file=@/path/to/file" http://localhost:8000/upload

以上示例中,上傳的文件將被保存在當(dāng)前目錄下,文件名與原文件名相同。

需要注意的是,上述示例沒有實(shí)現(xiàn)上傳進(jìn)度的監(jiān)控,如果需要監(jiān)控上傳進(jìn)度,可以使用第三方庫(kù),如github.com/cheggaaa/pb

0