GO語言原生實(shí)現(xiàn)文件上傳功能
本文實(shí)例為大家分享了GO原生實(shí)現(xiàn)文件上傳功能的具體代碼,供大家參考,具體內(nèi)容如下
寫在前面
最近在學(xué)習(xí)go,發(fā)現(xiàn)實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。在不引入任何框架的基礎(chǔ)上,利用go語言實(shí)現(xiàn)一個(gè)web小應(yīng)用也是比較方便的,但是坑還是不少,這里直接放上來,以防以后自己用得到,也希望可以幫到你。
首先寫處理文件上傳的handler
package handler /** 實(shí)現(xiàn)文件的上傳和下載 */ import ( ?? ?"fmt" ?? ?"io" ?? ?"io/ioutil" ?? ?"net/http" ?? ?"os" ) //文件上傳(這里一定要注意,方法名首字母大寫,否則無法在別的包中被引用發(fā)現(xiàn)) func UploadHandler(w http.ResponseWriter, r *http.Request) { ?? ?//這里的輸出數(shù)字是為了等下等直觀的感受程序運(yùn)行的過程,后面輸出的數(shù)字功能類似 ?? ?fmt.Printf("4") ?? ?//首次訪問指定url默認(rèn)采用GET方法提交,所以需要調(diào)出提交文件表單頁面 ?? ?if r.Method == "GET" { ?? ??? ?fmt.Printf("5") ?? ??? ?//通過讀取html文件再交由http.ResponseWriter輸出的方式實(shí)現(xiàn)文件提交頁面的喚出 ?? ??? ?data, err := ioutil.ReadFile("static/view/index.html") ?? ??? ?if err != nil { ?? ??? ??? ?_, _ = io.WriteString(w, "something wrong!") ?? ??? ??? ?return ?? ??? ?} ?? ??? ?_, _ = io.WriteString(w, string(data)) ?? ?} else if r.Method == "POST" { ?? ??? ?fmt.Printf("6") ?? ??? ?//將文件存儲(chǔ)至本地 ?? ??? ?file, head, err := r.FormFile("file") ?? ??? ?if err != nil { ?? ??? ??? ?fmt.Printf("Failed to get file data %s\n", err.Error()) ?? ??? ??? ?return ?? ??? ?} ?? ??? ?defer file.Close() ?? ??? ?//在本地創(chuàng)建一個(gè)新的文件去承載上傳的文件 ?? ??? ?newFile, err := os.Create("/tmp/" + head.Filename) ?? ??? ?if err != nil { ?? ??? ??? ?fmt.Printf("Failed to create newFile data %s\n", err.Error()) ?? ??? ??? ?return ?? ??? ?} ?? ??? ?defer newFile.Close() ?? ??? ?_, err = io.Copy(newFile, file) ?? ??? ?if err != nil { ?? ??? ??? ?fmt.Printf("Failed to save into newFile %s\n", err.Error()) ?? ??? ??? ?return ?? ??? ?} ?? ??? ?// 重定向到成功的頁面邏輯 ?? ??? ?http.Redirect(w, r, "/file/upload/suc", http.StatusFound) ?? ?} } // 文件上傳成功處理邏輯 func UploadSucHandler(w http.ResponseWriter, r *http.Request) { ?? ?_, _ = io.WriteString(w, "Upload Succeed!") }
其次完成main方法,注冊路由信息
所謂的注冊路由信息,其實(shí)就是類似于java框架中配置url攔截規(guī)則,具體見下:
package main import ( ?? ?"log" ?? ?"net/http" ?? ?"zone/src/handler" ) func main() { ?? ?//設(shè)置http的路由規(guī)則,類似于Java框架中設(shè)置請求攔截規(guī)則 ?? ?http.HandleFunc("/file/upload", handler.UploadHandler) ?? ?http.HandleFunc("/file/upload/suc", handler.UploadSucHandler) ?? ?//開啟http監(jiān)聽 ?? ?//err := http.ListenAndServe(":8080", nil) ?? ?//if err != nil { ?? ?//?? ?fmt.Printf("There is an err %s", err.Error()) ?? ?//} ?? ?//上面方法不太優(yōu)雅,現(xiàn)在用log直接包裹監(jiān)聽 ?? ?log.Fatal(http.ListenAndServe(":8081", nil)) }
最后完成前端文件提交頁面
<!DOCTYPE html> <html lang="en"> <head> ? ? <meta charset="UTF-8"> ? ? <title>上傳文件</title> </head> <body> <form action="/file/upload" method="post" enctype="multipart/form-data"> ? ? <p><input type="file" name="file" value=""></p> ? ? <p><input type="submit" value="submit"></p> </form> </body> </html>
測試一下
程序后臺(tái)執(zhí)行情況:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Go語言實(shí)現(xiàn)文件上傳
- GO實(shí)現(xiàn)文件上傳操作
- Go實(shí)現(xiàn)文件分片上傳
- Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼
- golang實(shí)現(xiàn)ftp實(shí)時(shí)傳輸文件的案例
- Golang實(shí)現(xiàn)異步上傳文件支持進(jìn)度條查詢的方法
- golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法
- 用go gin server來做文件上傳服務(wù)
- Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能示例
- Golang實(shí)現(xiàn)文件傳輸功能
相關(guān)文章
GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對(duì)象校驗(yàn)結(jié)構(gòu)體
這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對(duì)象校驗(yàn)結(jié)構(gòu)體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟
這篇文章主要介紹了golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03深入了解Golang中的Slice底層實(shí)現(xiàn)
本文主要為大家詳細(xì)介紹了Golang中slice的底層實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-02-02go實(shí)現(xiàn)一個(gè)分布式限流器的方法步驟
項(xiàng)目中需要對(duì)api的接口進(jìn)行限流,本文主要介紹了go實(shí)現(xiàn)一個(gè)分布式限流器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01一文帶你探索Go語言中crypto/md5標(biāo)準(zhǔn)庫的強(qiáng)大功能
我們將從MD5算法的基礎(chǔ)知識(shí)入手,逐步深入到如何在Go中有效使用crypto/md5標(biāo)準(zhǔn)庫,包括基本的使用方法、實(shí)際應(yīng)用案例分析,以及性能和安全性的考量,需要的可以參考下2024-02-02