<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在寫一個檔案上傳的功能,現在來進行整理總結一下go語言如何上傳檔案的,本文主要分享一下golang實現檔案上傳的流程和具體程式碼,供大家參考,感興趣的小夥伴們可以參考借鑑,希望對大家能有所幫助。
要使表單能夠上傳檔案,需要新增form的enctype屬性enctype="multipart/form-data"
,upload.html程式碼如下:
<html> <head> <title>上傳檔案</title> </head> <body> <form enctype="multipart/form-data" action="/upload" method="post"> <input type="file" name="uploadfile" /> <input type="submit" value="upload" /> </form> </body> </html>
在伺服器端啟動一個服務,並新增一個handlerFunc並完善相關功能即可:
package main import ( "fmt" "html/template" "io" "log" "net/http" "os" ) func main() { http.HandleFunc("/upload", Upload) if err := http.ListenAndServe("127.0.0.1:9090", nil); err != nil { log.Fatal(err) } } func Upload(w http.ResponseWriter, r *http.Request) { //判斷請求方式 if r.Method == "POST" { //設定記憶體大小 r.ParseMultipartForm(32 << 20) //獲取上傳檔案 file, handler, err := r.FormFile("uploadfile") if err != nil { fmt.Println(err) return } defer file.Close() fmt.Fprintf(w, "%v", handler.Header) //建立上傳目錄 os.Mkdir("./upload", os.ModePerm) //建立上傳檔案 f, err := os.Create("./upload/" + handler.Filename) if err != nil { fmt.Println(err) return } defer f.Close() io.Copy(f, file) w.WriteHeader(http.StatusCreated) io.WriteString(w, "Uploaded successfully") } else { //渲染頁面 解析模板檔案 tpl, _ := template.ParseFiles("./upload.html") tpl.Execute(w, nil) } }
通過http://127.0.0.1:9090/upload來測試檔案上傳。 截圖
選擇檔案之後就會在當前目錄下的upload資料夾中看到上傳的檔案了。
通過上面的範例可以看到,處理檔案上傳我們需要先呼叫FormFile,FormFile返回提供的表單鍵的第一個檔案, FormFile函數如下:
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 }
在FormFile方法中,會呼叫r.ParseMultipartForm, ParseMultipartForm函數如下:
func (r *Request) ParseMultipartForm(maxMemory int64) error { if r.MultipartForm == multipartByReader { return errors.New("http: multipart handled by MultipartReader") } if r.Form == nil { err := r.ParseForm() if err != nil { return err } } if r.MultipartForm != nil { return nil } mr, err := r.multipartReader(false) if err != nil { return err } f, err := mr.ReadForm(maxMemory) if err != nil { return err } if r.PostForm == nil { r.PostForm = make(url.Values) } for k, v := range f.Value { r.Form[k] = append(r.Form[k], v...) // r.PostForm should also be populated. See Issue 9305. r.PostForm[k] = append(r.PostForm[k], v...) } r.MultipartForm = f return nil }
裡面的參數列示maxMemory,呼叫ParseMultipartForm之後,ParseMultipartForm將請求主體解析為multipart / form-data。解析整個請求體,將上傳的檔案部分儲存在maxMemory大小的記憶體裡面,如果檔案大小超過了maxMemory,那麼剩下的部分將儲存在系統的臨時檔案中。我們可以通過r.FormFile獲取上面的檔案控制程式碼,然後範例中使用了io.Copy來儲存檔案。
檔案上傳主要有以下三步:
到此這篇關於GO語言實現檔案上傳的範例程式碼的文章就介紹到這了,更多相關GO語言檔案上傳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45