Go語言實戰案例:文件上傳服務

在 Web 開發中,文件上傳?是常見需求,例如頭像上傳、文檔存儲、圖片分享等功能。Go 語言的標準庫?net/http?已經內置了對?multipart/form-data?類型的支持,能讓我們輕松構建一個文件上傳服務。

本文將帶你實現一個可運行的文件上傳接口,并附帶 HTML 表單和?curl?測試方法。


一、目標功能

  • ? 路徑:/upload
  • ? 方法:POST
  • ? 表單字段:
    • ??file:上傳文件
    • ??desc:文件描述(可選)
  • ? 保存文件到本地?./uploads?目錄
  • ? 返回 JSON 結果

二、核心知識點

  • ??r.ParseMultipartForm(maxMemory):解析?multipart/form-data?表單
  • ??r.FormFile("file"):獲取上傳的文件
  • ??io.Copy(dst, src):保存文件到本地
  • ? 表單字段獲取:r.FormValue("desc")
  • ? 文件權限控制:os.Create()?/?os.MkdirAll()

三、完整代碼

package?mainimport?("encoding/json""fmt""io""net/http""os""path/filepath"
)type?UploadResponse?struct?{Filename?string?`json:"filename"`Size?????int64??`json:"size"`Desc?????string?`json:"desc"`Status???string?`json:"status"`
}func?uploadHandler(w?http.ResponseWriter,?r?*http.Request)?{if?r.Method?!=?http.MethodPost?{http.Error(w,?"Method?Not?Allowed",?http.StatusMethodNotAllowed)return}//?解析上傳表單(maxMemory?5MB,超過部分存臨時文件)err?:=?r.ParseMultipartForm(5?<<?20)if?err?!=?nil?{http.Error(w,?"Error?parsing?form:?"+err.Error(),?http.StatusBadRequest)return}//?獲取表單字段desc?:=?r.FormValue("desc")//?獲取文件file,?handler,?err?:=?r.FormFile("file")if?err?!=?nil?{http.Error(w,?"Error?retrieving?file:?"+err.Error(),?http.StatusBadRequest)return}defer?file.Close()//?確保保存目錄存在os.MkdirAll("./uploads",?os.ModePerm)//?保存文件filePath?:=?filepath.Join("uploads",?handler.Filename)dst,?err?:=?os.Create(filePath)if?err?!=?nil?{http.Error(w,?"Error?saving?file:?"+err.Error(),?http.StatusInternalServerError)return}defer?dst.Close()size,?err?:=?io.Copy(dst,?file)if?err?!=?nil?{http.Error(w,?"Error?writing?file:?"+err.Error(),?http.StatusInternalServerError)return}//?返回?JSON?響應w.Header().Set("Content-Type",?"application/json")json.NewEncoder(w).Encode(UploadResponse{Filename:?handler.Filename,Size:?????size,Desc:?????desc,Status:???"success",})
}func?main()?{http.HandleFunc("/upload",?uploadHandler)fmt.Println("文件上傳服務已啟動:http://localhost:8080/upload")http.ListenAndServe(":8080",?nil)
}

四、測試方法

1. HTML 表單測試

保存為?upload.html

<!DOCTYPE?html>
<html>
<body>
<h2>文件上傳測試</h2>
<form?action="http://localhost:8080/upload"?method="post"?enctype="multipart/form-data">文件描述:?<input?type="text"?name="desc"><br><br>選擇文件:?<input?type="file"?name="file"><br><br><input?type="submit"?value="上傳">
</form>
</body>
</html>

打開瀏覽器選擇文件并提交。


2. curl 命令測試

curl?-X?POST?http://localhost:8080/upload?\-F?"desc=測試圖片"?\-F?"file=@test.png"

五、運行效果

成功上傳后返回:

{"filename":?"test.png","size":?15324,"desc":?"測試圖片","status":?"success"
}

文件會保存在?./uploads/test.png


六、注意事項

  1. 1.?上傳限制
    通過?r.ParseMultipartForm(maxMemory)?控制內存占用,超過部分會寫入臨時文件。
  2. 2.?安全性
    • ? 校驗文件類型(避免執行惡意文件)
    • ? 生成唯一文件名(避免覆蓋)
    • ? 設置合理的文件大小限制(可用?http.MaxBytesReader
  3. 3.?跨域請求
    如果前端與后端不在同一域名,需要設置?Access-Control-Allow-Origin?等 CORS 頭。

七、進階擴展

  • ? 上傳時自動生成文件唯一 ID(防止文件名沖突)
  • ? 返回文件訪問 URL
  • ? 將文件上傳到云存儲(如 AWS S3、阿里云 OSS)
  • ? 支持多文件同時上傳(r.MultipartForm.File["file"]

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

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

相關文章

【Lua】常用的庫

os庫&#xff1a;os.time() -- 輸出當前時間的時間戳 os.time({year 2014, month 8, day 14}) -- 獲取指定時間的時間戳local nowTime os.date("*t") -- 以表的形式獲取當前的時間信息for k,v in pairs(nowTime) doprint(k,v) end--以上for循環示例輸出 {year 2…

Mac上安裝和配置MySQL(使用Homebrew安裝MySQL 8.0)

在Mac上安裝MySQL是一個簡單高效的過程&#xff0c;尤其是通過Homebrew這一強大的包管理工具。本文將詳細介紹如何在macOS 15.6系統中使用Homebrew安裝MySQL 8.0版本&#xff0c;并完成基本配置&#xff0c;幫助您快速啟動并安全使用MySQL。1. 安裝Homebrew&#xff08;若未安裝…

【Datawhale AI夏令營】從Baseline到SOTA:深度剖析金融問答RAG管道優化之路

從Baseline到SOTA&#xff1a;深度剖析金融問答RAG管道優化之路 引言 檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;已成為構建知識密集型AI應用的事實標準 1。然而&#xff0c;從一個簡單的“hello world”級別的RAG&#xff0c;進化到一個能在競…

AI鑒偽技術:守護數字時代的真實性防線

文章目錄一、引言&#xff1a;AI偽造技術的“數字病毒”與鑒偽技術的“免疫疫苗”二、合合信息三大AI鑒偽技術解析2.1 人臉視頻鑒偽技術&#xff1a;毫秒級擊穿“數字假面”2.1.1 技術突破&#xff1a;從“像素級標記”到“多模態交叉驗證”2.2 AIGC圖像鑒別技術&#xff1a;讓…

論文reading學習記錄7 - daily - ViP3D

文章目錄前言一、題目和摘要二、引言三、相關工作四、方法五、訓練前言 開沖&#xff0c;清華大學的&#xff0c;帶HDmap的端論文&#xff0c;用的Query&#xff0c;和UniAD一樣。 一、題目和摘要 ViP3D: End-to-end Visual Trajectory Prediction via 3D Agent Queries ViP3…

Java學習第一百零九部分——Jenkins(一)

目錄 一、前言簡介 二、核心價值與優勢 三、關鍵概念 四、下載安裝與配置 五、總結歸納概述 一、前言簡介 Jenkins 是一個開源的、基于 Java 的自動化服務器。它的核心使命是實現持續集成和持續交付。簡單來說&#xff0c;Jenkins 是一個強大的工具&#xff0c;用于自動化…

微算法科技(NASDAQ:MLGO)使用循環QSC和QKD的量子區塊鏈架構,提高交易安全性和透明度

隨著量子計算技術的快速發展&#xff0c;傳統區塊鏈所依賴的加密算法面臨著被破解的潛在風險。量子計算的強大計算能力可能會在未來打破現有加密體系的安全性&#xff0c;從而對區塊鏈中的交易數據造成威脅。為了應對這一挑戰&#xff0c;將量子技術與區塊鏈相結合成為了必然的…

MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層

&#x1f504; MyBatis SQL映射與動態SQL&#xff1a;構建靈活高效的數據訪問層 &#x1f680; 引言&#xff1a;動態SQL是MyBatis框架的核心優勢之一&#xff0c;它讓我們能夠根據不同條件動態構建SQL語句&#xff0c;避免了傳統JDBC中大量的字符串拼接。本文將深入解析MyBati…

v-model雙向綁定指令

文章目錄前言v-model.lazy 延遲同步v-model.trim 去掉空格前言 v-model指令是Vue.js中實現雙向數據綁定的一種重要機制。它可以將表單控件的值與Vue.js實例中的數據進行雙向綁定&#xff0c;即當表單控件的值發生變化時&#xff0c;Vue.js實例中的數據也會隨之更新&#xff0c…

電腦IP地址是“169.254.x.x”而無法上網的原因

一、核心原因&#xff1a;自動私有 IP 地址&#xff08;APIPA&#xff09;的啟用APIPA 機制&#xff1a;這是 Windows 等操作系統內置的一種 “備用方案”。當電腦設置為 “自動獲取 IP 地址”&#xff08;通過 DHCP 協議&#xff09;&#xff0c;但無法從路由器、光貓等網絡設…

單片機存儲區域詳解

目錄 單片機內存區域劃分 boot引腳啟動介紹 1. boot引腳的三大啟動區域介紹 1.用戶閃存(User Flash) - 最常用模式 2. 系統存儲區(System Memory) - 出廠預置Bootloader區 3. 內置SRAM啟動(RAM Boot) - 特殊調試模式 2.用戶閃存(User Flash)內存管理詳解 一、用戶閃存中…

Go語言實戰案例:簡易JSON數據返回

在現代 Web 應用中&#xff0c;JSON 已成為前后端通信的主流數據格式。Go 語言標準庫內置對 JSON 的良好支持&#xff0c;只需少量代碼就能返回結構化的 JSON 響應。本篇案例將手把手帶你完成一個「返回 JSON 數據的 HTTP 接口」&#xff0c;幫助你理解如何用 Go 語言實現后端服…

扣子Coze中的觸發器實現流程自動化-實現每日新聞卡片式推送

基礎知識 什么是觸發器/能做什么 Triggers 智能體設置觸發器&#xff08;Triggers&#xff09;&#xff0c;使智能體在特定時間或接收到特定事件時自動執行任務。為什么需要觸發器&#xff1f;實操步驟 第1步&#xff1a;打開一個智能體編輯頁第2步&#xff1a;技能 - 觸發器 -…

GitCode 7月:小程序積分商城更名成長中心、「探索智能倉頡!Cangjie Magic 體驗有獎征文活動」圓滿收官、深度對話欄目持續熱播

運營情況總結 &#x1f389; 截至7月底&#xff0c;GitCode 這個熱鬧的開發者社區&#xff0c;已經聚集了 656 萬位開發者小伙伴啦&#xff01; &#x1f4bb; 產品&#xff1a;小程序積分商城更名為成長中心啦&#xff0c;更多功能將陸續上線。 &#x1f31f; G-Star&#xff…

機器學習之支持向量機(原理)

目錄 摘要 一、概述 二、SVM算法定義 1.超平?最?間隔介紹 2.硬間隔和軟間隔 1.硬間隔分類 2. 軟間隔分類 三、SVM算法原理 1 定義輸?數據 2 線性可分?持向量機 3 SVM的計算過程與算法步驟 四、核函數 五、SVM算法api介紹 1. 核心參數說明 2. 主要方法 3. 重…

【Unity3D實例-功能-跳躍】角色跳躍

今天&#xff0c;我們來聊聊 Unity 里最常打交道的動作之一——角色跳躍。無論是橫版闖關還是 3D 跑酷&#xff0c;跳躍都是讓角色“活”起來的核心操作。在 Unity 里&#xff0c;幾行腳本就能讓角色一蹬而起、穩穩落地。下面&#xff0c;就讓我們一起把這個“彈跳感”親手做出…

react+echarts實現變化趨勢縮略圖

如上圖&#xff0c;實現一個縮略圖。 import React, { useState, useEffect } from react; const ParentCom () > {const [data, setData] useState({});useEffect(() > {// 這里可以做一些接口請求等操作setData({isSheng: false, value: 11.24, percentage: 2.3%, da…

C語言宏相關操作

宏 宏名稱通常都是由大寫英文字母構成的宏名稱里不可以包含空格用宏給數字起名字的時候不可以使用賦值運算符&#xff0c;不要自增自減可以在編寫程序的時候直接使用宏名稱替代數字&#xff0c;編譯器在編譯的時候會把程序里的宏替換成它所代表的數字 1. 為什么要使用宏&#x…

STM32內部讀寫FLASH

很多情況下&#xff0c;在STM32中寫入一些數據&#xff0c;在某些不可控因素下其數據無法保存。因此,解決此問題就要用到FLASH.什么是內部 Flash&#xff1f; Flash 是一種非易失性存儲器&#xff0c;STM32 的程序和常量數據就存在 Flash 中。它的關鍵特點是&#xff1a;特性說…

Oracle 12c + Pl/Sql windows系統下表空間創建、遷移,dmp備份導入,數據庫字符集更改

一、開發環境 操作系統&#xff1a;win11 Oracle版本&#xff1a;12c Oracle 數據庫字符集&#xff1a;AL32UTF8 Pl/Sql版本&#xff1a;14 二、表空間創建 表空間是 Oracle 數據庫中一種重要的邏輯結構&#xff0c;它是數據庫中數據文件的邏輯集合&#xff0c;用于存儲數據庫對…