網(wǎng)站首頁 編程語言 正文
本文實例為大家分享了GO原生實現(xiàn)文件上傳功能的具體代碼,供大家參考,具體內(nèi)容如下
寫在前面
最近在學(xué)習(xí)go,發(fā)現(xiàn)實踐才是檢驗真理的唯一標(biāo)準(zhǔn)。在不引入任何框架的基礎(chǔ)上,利用go語言實現(xiàn)一個web小應(yīng)用也是比較方便的,但是坑還是不少,這里直接放上來,以防以后自己用得到,也希望可以幫到你。
首先寫處理文件上傳的handler
package handler /** 實現(xiàn)文件的上傳和下載 */ import ( ?? ?"fmt" ?? ?"io" ?? ?"io/ioutil" ?? ?"net/http" ?? ?"os" ) //文件上傳(這里一定要注意,方法名首字母大寫,否則無法在別的包中被引用發(fā)現(xiàn)) func UploadHandler(w http.ResponseWriter, r *http.Request) { ?? ?//這里的輸出數(shù)字是為了等下等直觀的感受程序運行的過程,后面輸出的數(shù)字功能類似 ?? ?fmt.Printf("4") ?? ?//首次訪問指定url默認(rèn)采用GET方法提交,所以需要調(diào)出提交文件表單頁面 ?? ?if r.Method == "GET" { ?? ??? ?fmt.Printf("5") ?? ??? ?//通過讀取html文件再交由http.ResponseWriter輸出的方式實現(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") ?? ??? ?//將文件存儲至本地 ?? ??? ?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)建一個新的文件去承載上傳的文件 ?? ??? ?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方法,注冊路由信息
所謂的注冊路由信息,其實就是類似于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>
測試一下
程序后臺執(zhí)行情況:
原文鏈接:https://blog.csdn.net/weixin_38107316/article/details/111132385
相關(guān)推薦
- 2021-12-18 ECommerceCrawlers項目分析(十二)
- 2022-08-15 當(dāng)添加一個鍵值對元素時,HashMap發(fā)生了什么?
- 2022-05-13 e engine “node“ is incompatible with this module.
- 2022-08-19 如何將yolov5中的PANet層改為BiFPN詳析_python
- 2022-07-28 C++圖文并茂講解類型轉(zhuǎn)換函數(shù)_C 語言
- 2022-08-15 C語言排序算法實現(xiàn)
- 2022-07-06 ?ASP.NET?Core?模型驗證過濾器的兩種實現(xiàn)方法_實用技巧
- 2021-11-27 關(guān)于UDP服務(wù)器客戶端編程流程介紹_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支