在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
。