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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;用于存储数据库对…