goweb原生实现HTTP文件上传功能

 更新时间:2026年02月25日 10:30:10   作者:郭京京  
在Go语言中,使用原生net/http包实现HTTP文件上传功能,主要依赖multipart/form-data编码解析和文件流处理, 下面就来详细的介绍一下如何实现,感兴趣的可以了解一下

在Go语言中,使用原生net/http包实现HTTP文件上传功能,主要依赖multipart/form-data编码解析和文件流处理。

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	_, err := os.Stat(".\uploads")
	if err == nil {

	}
	if os.IsNotExist(err) {
		// 文件夹不存在,创建文件夹
		err := os.MkdirAll(".\uploads", 0755)
		if err != nil {
			fmt.Errorf("创建文件夹失败: %w", err)
		}

	}
	// 其他错误
	fmt.Errorf("检查文件夹时出错: %w", err)

	http.HandleFunc("/upload", uploadHandler)


	log.Fatalln(http.ListenAndServe(":80", nil))
}

// 支持多文件/大文件上传
func uploadHandler(w http.ResponseWriter, r *http.Request) {
	// 1. 安全校验
	if r.Method != "POST" {
		w.WriteHeader(http.StatusMethodNotAllowed)
		return
	}

	// 2. 限制上传大小(10GB)
	r.Body = http.MaxBytesReader(w, r.Body, 10<<30)

	// 3. 多文件处理
	if err := r.ParseMultipartForm(32 << 20); err != nil {
		log.Printf("Upload failed: %v", err)
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	// 4. 遍历处理文件
	files := r.MultipartForm.File["files"]
	fmt.Println(files)
	for _, fileHeader := range files {
		file, err := fileHeader.Open()
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		defer file.Close()

		// 5. 安全存储
		safePath := filepath.Join("uploads", filepath.Base(fileHeader.Filename))
		fmt.Println(filepath.Base(fileHeader.Filename))
		if strings.Contains(safePath, "..") {
			http.Error(w, "Invalid file path", http.StatusBadRequest)
			return
		}
		fmt.Println(safePath)
		dst, err := os.Create(safePath)
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		defer dst.Close()

		if _, err := io.Copy(dst, file); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
	}

	w.Write([]byte("Upload successful"))
}

使用curl 测试:

D:

echo "hello world,file test upload" >> file.txt

curl -H "Content-Type: multipart/form-data" -F "files=@file.txt" http://localhost/upload

curl命令

Win10及以上系统默认已安装Curl,打开命令提示符输入 curl --help,若显示帮助信息则无需安装

​手动安装方法​​ 

  • 官网下载:访问 curl官网 选择Windows版本curl for Windows
  • 若需在 Windows XP 等旧系统使用,需选择更低版本(如 curl 7.56.1)
  • 解压配置:将压缩包解压至指定目录(如 C:\curl),右键“此电脑”→属性→高级系统设置→环境变量→Path中添加 %CURL_HOME%\bin
  • 验证安装:重启CMD输入 curl -V 显示版本号即成功

基础语法 

curl [选项] [URL]
  • URL:目标地址(如 https://example.com )。

  • 选项:控制请求行为,常用选项包括:

    • -X <方法>:指定HTTP方法(如 GETPOSTPUT)。
    • -H "头字段":添加请求头(如 -H "Content-Type: application/json")。
    • -d "数据":发送请求体(POST/PUT时常用)。
    • -o <文件名>:将输出保存到文件。
    • -v:显示详细请求/响应信息(调试用)。

常见场景示例

# 发送GET请求
curl https://api.example.com/data  
curl -H "Authorization: Bearer token" https://api.example.com/protected  

# 发送POST请求
curl -X POST -d "name=John&age=30" https://api.example.com/users 
curl -X POST -H "Content-Type: application/json" -d "{"name":"John"}" https://api.example.com/users 

# 下载文件
curl -o output.zip  https://example.com/file.zip 
# 上传文件 
curl -F "file=@localfile.txt"  https://example.com/upload  

Netstat 详解:网络连接统计工具

netstat(Network Statistics)是 Windows、Linux/Unix 系统内置的网络诊断工具,用于显示网络连接、路由表、接口统计等信息。

Netstat 核心功能

  1. 显示活动网络连接(TCP/UDP)
  2. 查看监听端口(服务是否运行)
  3. 统计网络接口流量(发送/接收数据)
  4. 路由表信息(IP 路由路径)
  5. 协议统计(IPv4/IPv6 数据包分析)

基础语法

netstat [选项]
参数说明
-a显示所有连接和监听端口
-n以数字形式显示地址和端口(禁用域名解析)
-o显示进程 PID(可配合任务管理器查杀恶意程序)
-p TCP仅显示 TCP 协议连接
-e显示网络接口流量统计(收发字节数)
-r显示路由表(类似 route print)
-s按协议显示统计信息(TCP/UDP/ICMP/IP)
netstat -ano #查看所有活动连接
netstat -ano | findstr ":80"  #检查 80 端口占用情况(排查 Web 服务冲突)
netstat -e 2  #监控实时网络流量(每 2 秒刷新)
netstat -s -p tcp #统计TCP协议相关数据(如重传率、连接数),辅助诊断网络性能问题

常见TCP状态说明​​:

  • ​LISTEN​​:服务端监听端口
  • ​ESTABLISHED​​:双向通信中
  • ​TIME_WAIT​​:连接关闭后的等待状态(正常现象)
  • ​SYN_SENT​​:客户端发起连接请求

 

  • 解读:本地 192.168.1.2 通过临时端口 54321,正与远程服务器 93.184.216.34 的 TCP 端口(443)进行双向通信中。

到此这篇关于goweb原生实现HTTP文件上传功能的文章就介绍到这了,更多相关go web HTTP文件上传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!​

相关文章

  • Go语言的互斥锁的详细使用

    Go语言的互斥锁的详细使用

    本文主要介绍了Go语言的互斥锁的详细使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go语言解决大模型API调用中的超时错误的方法

    Go语言解决大模型API调用中的超时错误的方法

    在开发基于大语言模型(如DeepSeek)的智能应用时,我们常通过API实现自然语言交互,但在处理复杂任务或网络波动时,开发者可能会遭遇 context deadline exceeded错误,本文将以Go语言为例,深入分析该问题的根源,并提供一套完整的优化方案,需要的朋友可以参考下
    2025-05-05
  • Go语言优雅实现单例模式的多种方式

    Go语言优雅实现单例模式的多种方式

    单例模式(Singleton Pattern)是一种设计模式,旨在保证一个类只有一个实例,并且提供全局访问点,单例模式通常用于需要限制某个对象的实例数量为一个的场景,本文给大家介绍了Go语言实现单例模式的多种方式,需要的朋友可以参考下
    2025-02-02
  • Golang使用Consul详解

    Golang使用Consul详解

    Consul是一个服务发现软件, 提供了服务发现\键值存储\健康检查等功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • golang如何实现抓取IP地址的蜘蛛程序详解

    golang如何实现抓取IP地址的蜘蛛程序详解

    这篇文章主要给大家介绍了关于利用golang如何实现抓取IP地址的蜘蛛程序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • golang gorm更新日志执行SQL示例详解

    golang gorm更新日志执行SQL示例详解

    这篇文章主要为大家介绍了golang gorm更新日志执行SQL示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 详解如何在Go语言中生成随机种子

    详解如何在Go语言中生成随机种子

    这篇文章主要为大家详细介绍了如何在Go语言中生成随机种子,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • 浅谈Golang中创建一个简单的服务器的方法

    浅谈Golang中创建一个简单的服务器的方法

    这篇文章主要介绍了浅谈Golang中创建一个简单的服务器的方法,golang中的net/http包对网络的支持非常好,这样会让我们比较容易的建立起一个相对简单的服务器,有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • pytorch中的transforms.ToTensor和transforms.Normalize的实现

    pytorch中的transforms.ToTensor和transforms.Normalize的实现

    本文主要介绍了pytorch中的transforms.ToTensor和transforms.Normalize的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Go工具链之go tool fix用法详解

    Go工具链之go tool fix用法详解

    go tool fix 是 Go 工具链中的一个命令,作用是把指定 Go 程序代码包中的的所有旧版本代码修正为新版本的代码,本文将简单介绍一下go tool fix的使用方法,感兴趣的小伙伴可以参考阅读下
    2023-07-07

最新评论