基于gin框架的文件上傳(逐行解析)

            基于gin框架的文件上傳(逐行解析)

記錄一下使用gin框架完成一個文件上傳的功能,一下是實現該功能的代碼,適合小白,代碼都有逐行解釋!

app.go:

package routerimport ("chat/service""github.com/gin-gonic/gin"
)func Router() *gin.Engine {r := gin.Default()//上傳文件,使用post請求r.POST("/attach/upload", service.Upload)return r
}

attach.go:

package serviceimport ("chat/utils""fmt""github.com/gin-gonic/gin""io""math/rand""net/http""os""strings""time"
)func Upload(c *gin.Context) {UploadLocal(c)
}// 上傳文件到本地
func UploadLocal(c *gin.Context) {w := c.Writer //獲取響應的gin上下文寫入器req := c.Request//獲取當前請求對象//從請求中通過FormFile方方法獲取指定名稱("file")的文件//srcFile為獲取到的源文件//head為文件的頭部信息//err為可能出現的錯誤srcFile, head, err := req.FormFile("file") if err != nil {//使用utils.RespFail()函數響應寫入失敗信息和錯誤內容utils.RespFail(w, err.Error())}
//定義默認的文件后綴為".png"suffix := ".png"//從head中獲取文件信息head有以下常用變量//head.Header 文件的頭部信息,包含一些與文件相關的元數據,比如文件的類型、大小//head.Size 文件的大小//head.Filename 文件的名字ofilName := head.Filename //定義一個字符串切片tem,使用strings。Split()將文件名ofilName按照(.)進行分割再裝入這個切片當中,tem := strings.Split(ofilName, ".")//如果分割后的結果長度大于1,表示有后綴if len(tem) > 1 {// 將后綴更新為分割后的最后一部分(該切片的最后一個元素)suffix = "." + tem[len(tem)-1]}// 根據當前時間的 Unix 時間戳、隨機生成的 32 位整數和后綴生成文件名fileName := fmt.Sprintf("%d%04d%s", time.Now().Unix(), rand.Int31(), suffix)//使用os.Create()在指定路徑("./files/"+fileName)創建新的文件dstFile, err := os.Create("./files/" + fileName)if err != nil {//使用utils.RespFail()函數響應寫入失敗信息和錯誤內容utils.RespFail(w, err.Error())}// 使用 io.Copy 方法將源文件的內容拷貝到目標文件中// err 為可能出現的拷貝過程中的錯誤_, err = io.Copy(dstFile, srcFile)if err != nil {//使用utils.RespFail()函數響應寫入失敗信息和錯誤內容utils.RespFail(w, err.Error())}//構建文件的完整的URLurl := "./files/" + fileName// 使用 utils.RespOK 函數向響應寫入成功信息、文件的 URL 以及成功消息utils.RespOK(w, url, "發送成功")
}

resp.go:主要用處理請求響應的各種狀態

package utilsimport (// 導入相關包"encoding/json""fmt""net/http"
)type H struct {// 定義結構體 H,包含代碼、消息、數據、行數和總數等字段Code  intMsg   stringData  interface{}Rows  interface{}Total interface{}
}// Resp 函數,用于響應數據
func Resp(w http.ResponseWriter, code int, data interface{}, msg string) {// 設置響應頭的內容類型為 JSONw.Header().Set("Content-Type", "application/json")// 設置響應狀態碼為 200(OK)w.WriteHeader(http.StatusOK)h := H{// 初始化結構體 H 的字段Code: code,Data: data,Msg:  msg,}// 對結構體 H 進行 JSON 序列化操作ret, err := json.Marshal(h)if err!= nil {// 處理序列化錯誤fmt.Println(err)}w.Write(ret)
}// RespList 函數,用于響應列表數據
func RespList(w http.ResponseWriter, code int, data interface{}, total interface{}) {w.Header().Set("Content-Type", "application/json")w.WriteHeader(http.StatusOK)h := H{// 初始化結構體 H 的字段Code:  code,Rows:  data,Total: total,}ret, err := json.Marshal(h)if err!= nil {// 處理序列化錯誤fmt.Println(err)}w.Write(ret)
}// RespFail 函數,用于響應失敗信息
func RespFail(w http.ResponseWriter, msg string) {// 調用 Resp 函數,設置代碼為-1,表示失敗Resp(w, -1, nil, msg)
}// RespOK 函數,用于響應成功信息
func RespOK(w http.ResponseWriter, data interface{}, msg string) {// 調用 Resp 函數,設置代碼為 0,表示成功Resp(w, 0, data, msg)
}// RespOKList 函數,用于響應成功的列表信息
func RespOKList(w http.ResponseWriter, data interface{}, total int) {// 調用 RespList 函數,設置代碼為 0,表示成功RespList(w, 0, data, total)
}

main.go:

package mainimport "chat/router"func main() {r := router.Router()r.Run(":8081")
}

寫完了:測試一下

使用postman提交一個文件參數

在這里插入圖片描述

查看是否上傳成功

在這里插入圖片描述

可以看到文件上傳成功了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11090.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡工程師練習題

網絡工程師練習題 網橋怎樣知道網絡端口連接了那些網站?如果從端口收到一個數據幀,則將其源地址記入該端口的數據庫當網橋連接的局域網出現環路時怎么辦?運行生成樹協議阻塞一部分端口。使用IEEE 802.1q協議,最多可以配置4094個VLAN。VLAN中繼協議(VTP)有不同的工作模式,…

C++異常詳解

文章目錄 前言一、回顧C語言二、異常的概念三、異常的使用1.異常的拋出和捕獲2.異常的重新捕獲 三.異常安全與異常規范1.異常安全2.異常規范 四.自定義異常體系五.C標準庫的異常體系六.異常優缺點練習題總結 前言 在本篇文章中,我們將會詳細介紹一下有關C異常的講解…

微服務架構:注冊中心 Eureka、ZooKeeper、Consul、Nacos的選型對比詳解

微服務架構(Microservices Architecture)是一種基于服務拆分的分布式架構模式,旨在將復雜的單體應用程序拆分為一組更小、更獨立的服務單元。這些服務單元可以獨立開發、測試、部署,并使用不同的技術棧和編程語言。它們通過輕量級…

[華為OD] C卷 dfs 特殊加密算法 100

題目: 有一種特殊的加密算法,明文為一段數字串,經過密碼本查找轉換,生成另一段密文數字串。 規則如下 1?明文為一段數字串由0-9組成 2.密碼本為數字0-9組成的二維數組 3?需要按明文串的數字順序在密碼本里找到同樣的數字串…

PUBG非升級實用槍皮-部分盤點

藏匿處的黑貨箱武器需要耗費高額成本才能升級 對于像我這樣的日常休閑玩家來說是一筆不小的(巨大的!)負擔 其實有許多普通非升級槍皮也是不錯的選擇 今天就來盤點一下我自己日常在用的普通皮 來看看你是不是也在用一樣的 (僅是盤點…

【OceanBase診斷調優】—— 租戶資源統計項及其查詢方法

本文主要介紹 OceanBase 數據庫中租戶資源統計項及其查詢方法。 適用版本 OceanBase 數據庫 V4.1.x、V4.2.x 版本。 CPU 資源統計項 邏輯 CPU 使用率(線程處理請求的時間占比)。 通過虛擬表 __all_virtual_sysstat 在 SYS 系統租戶下,查看…

AtCoder Beginner Contest 308 A題 New Scheme

A題:New Scheme 標簽:模擬 題意:給定 8 8 8個數的序列,詢問這些數是否滿足以下條件: 在 100 100 100到 675 675 675之間且能被 25 25 25整除序列是單調非遞減的 題解:按題意模擬判斷就好了。 代碼&#…

09.zabbix自定義模塊并使用

zabbix自定義模塊并使用 根據tcp的11中狀態獲取值,進行批量配置監控項 [rootyunlong66 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf UserParameterESTABLISHED,netstat -antp |grep -c ESTABLISHED UserParameterSYN_SENT,netstat -antp |grep -c SYN_SENT Use…

Obsidian/Typora設置圖床

在obsidian中默認圖片是保存在本地的,但是在要導出文檔上傳到網上時,由于圖片保存在本地,會出現無法加載圖片的問題。 這里引用的一段話: 這里使用picgo-core和gitee實現圖床功能, 參考1: Ubuntu下PicGO配…

Github學習

1.Git與Github 區別: Git是一個分布式版本控制系統,簡單的說就是一個軟件,用于記錄一個或若干個文件內容變化,以便將來查閱特點版本修訂情況的軟件。 Github是一個為用戶提高Git服務的網站,簡單說就是一個可以放代碼的地方。Gi…

C語言 | Leetcode C語言題解之第85題最大矩形

題目&#xff1a; 題解&#xff1a; int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;if (m 0) {return 0;}int n matrixColSize[0];int left[m][n];memset(left, 0, sizeof(left));for (int i 0; i < m; i) {for (int j …

SeetaFace6人臉活體檢測C++代碼實現Demo

SeetaFace6包含人臉識別的基本能力&#xff1a;人臉檢測、關鍵點定位、人臉識別&#xff0c;同時增加了活體檢測、質量評估、年齡性別估計&#xff0c;并且順應實際應用需求&#xff0c;開放口罩檢測以及口罩佩戴場景下的人臉識別模型。 官網地址&#xff1a;https://github.co…

【補充】圖神經網絡前傳——DeepWalk

論文閱讀 論文&#xff1a;https://arxiv.org/pdf/1403.6652 參考&#xff1a;【論文逐句精讀】DeepWalk&#xff0c;隨機游走實現圖向量嵌入&#xff0c;自然語言處理與圖的首次融合_隨機游走圖嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一個網絡中學習頂點…

【Mac】Ghost Buster Pro(蘋果電腦內存清理專家) v3.2.5安裝教程

軟件介紹 Ghost Buster pro是一款針對Mac系統的電腦清理和優化工具&#xff0c;可以幫助用戶清理系統垃圾、修復注冊表錯誤、卸載不需要的軟件、管理啟動項等&#xff0c;從而提高系統性能和穩定性。 安裝教程 1.打開鏡像包&#xff0c;拖動「Ghost Buster Pro」到應用程序中…

GIT SSL certificate problem

簡單來說&#xff0c;SSL 協議可以為你的 Web 瀏覽器或其他進程提供一種安全的通道&#xff0c;使服務器和客戶端之間的數據傳輸過程不被第三方竊取或篡改。這非常重要&#xff0c;特別是在處理敏感數據&#xff0c;比如信用卡信息、用戶名和密碼等情況下。 現在&#xff0c;S…

Flutter 中的 Row 小部件:全面指南

Flutter 中的 Row 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Row 是一個水平布局的小部件&#xff0c;用于將子控件沿著水平軸排列。Row 類似于 HTML 中的 div 標簽&#xff0c;但僅限于水平布局。它非常適合用來創建行式布局&#xff0c;如表單輸入、按鈕組、標簽…

【linux軟件基礎知識】完全公平調度

完全公平調度&#xff08;CFS&#xff09; CFS根據每個進程相對于所有可運行線程總權重的權重為每個進程分配一個“時間片”。 CFS 的目標是近似“無限小”的調度持續時間&#xff0c;稱為目標延遲。 較小的目標延遲可以提高交互性并接近完美的多任務處理&#xff0c;但其代價…

【Linux網絡】Https【下】{CA認證/證書的簽發與認證/安全性/總結}

文章目錄 1.引入證書【為方案五鋪墊】1.1再談https1.2SSL/TLS1.3CA機構1.4理解數字簽名1.4繼續鋪墊1.5方案五服務端申請證書回顧一二三回顧方案四方案五過程尋找方案五的漏洞客?端對證書進?認證 2.查看證書2.1查看瀏覽器的受信任證書發布機構2.2中間?有沒有可能篡改該證書2.…

差分約束 C++ 算法例題

差分約束 差分約束 是一種特殊的 n 元一次不等式組&#xff0c;m 個約束條件&#xff0c;可以組成形如下的格式&#xff1a; { x 1 ? x 1 ′ ≤ y 1 x 2 ? x 2 ′ ≤ y 2 ? x m ? x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

數據庫的要求

本來我是不準備寫數據庫的。而且是準備從零開始&#xff0c;學習python&#xff0c;學完語言學&#xff0c;會c和寫作技法&#xff0c;再來學習數據庫 那樣做的復雜度是天量的&#xff0c;按部就班什么的具備&#xff0c;因為你完全不清楚什么時候就有這個基礎和條件&#xff0…