0

0

Golang 处理大文件 HTTP 上传

花韻仙語

花韻仙語

发布时间:2025-11-02 22:38:01

|

202人浏览过

|

来源于php中文网

原创

golang 处理大文件 http 上传

本文介绍了如何使用 Golang 的 net/http 包构建 Web 服务器,并有效处理大文件上传。重点在于理解 Expect: 100 Continue 机制,以及如何利用 request.ParseMultipartForm 函数将文件数据高效地存储在内存或磁盘上。同时,提供了前端 JavaScript 代码示例,演示了如何通过 FormData 对象将文件上传到服务器。

在构建 Web 服务器时,处理大文件上传是一个常见的需求。Golang 的 net/http 包提供了强大的功能来支持这一需求。本文将深入探讨如何使用 net/http 包处理大文件上传,并处理客户端发送的 Expect: 100 Continue 请求。

理解 Expect: 100 Continue

当客户端发送 Expect: 100 Continue 请求头时,它实际上是在询问服务器是否愿意接受整个请求。如果服务器准备好接收数据,则返回 HTTP/1.1 100 Continue 响应。如果服务器无法处理请求(例如,由于资源不足或请求格式错误),则返回错误代码,如 417 Expectation Failed。

立即学习go语言免费学习笔记(深入)”;

使用 request.ParseMultipartForm 处理文件上传

request.ParseMultipartForm 是处理 multipart/form-data 请求的关键函数。它可以解析整个请求体,并将文件部分存储在内存或磁盘上。

浚心时尚购物商城程序
浚心时尚购物商城程序

时尚购物程序v1.01、全立体设计。此系统由3个Flash动画为主线(正式版带原文件),设计更形象,网站更有吸引力。这种设计在网店系统内绝无仅有,使您的网店与众不同。2、内置音乐播放器,简单灵活的操作即可完成设置,前台任意调用。并带详细说明文件,一看就懂。合理使用此功能,可使网站更富渲染力。3、支持多图显示,每件产品最多可以上传9张图片。4、后台功能强大,销售管理,财务管理,在线支付平台管理等功能

下载
import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // 10MB in memory, the rest in disk
    err := r.ParseMultipartForm(10 * 1024 * 1024)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    formdata := r.MultipartForm

    for key, headers := range formdata.File {
        // 确保 headers 不为空
        if len(headers) == 0 {
            fmt.Printf("No file found for key: %s\n", key)
            continue
        }

        file, err := headers[0].Open()
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer file.Close()

        fileData, err := ioutil.ReadAll(file)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        fileName := headers[0].Filename
        fmt.Printf("Uploaded file: %s, size: %d bytes\n", fileName, len(fileData))

        // 在这里处理文件数据,例如保存到磁盘或数据库
        // ...

        // 示例:将文件内容打印到控制台
        //fmt.Println(string(fileData))
    }

    fmt.Fprintln(w, "File uploaded successfully!")
}

func main() {
    http.HandleFunc("/upload", handler)
    fmt.Println("Server listening on port 8080")
    http.ListenAndServe(":8080", nil)
}

代码解释:

  1. r.ParseMultipartForm(10 * 1024 * 1024): 这行代码解析 multipart/form-data 请求。参数 10 * 1024 * 1024 指定了最大内存使用量(10MB)。超过此大小的文件部分将存储在磁盘上的临时文件中。
  2. formdata := r.MultipartForm: 获取解析后的表单数据。formdata.File 是一个 map[string][]*multipart.FileHeader 类型的映射,其中键是表单字段的名称,值是与该字段关联的文件头切片。
  3. 循环遍历 formdata.File: 遍历上传的文件。
  4. headers[0].Open(): 打开文件。headers[0] 是与特定表单字段关联的第一个文件。
  5. ioutil.ReadAll(file): 读取文件的全部内容。
  6. fileName := headers[0].Filename: 获取上传文件的文件名。
  7. 文件处理: 在注释 // 在这里处理文件数据... 的位置,你可以根据需要处理文件数据,例如将其保存到磁盘、数据库或云存储

前端 JavaScript 代码示例

以下是一个使用 JavaScript FormData 对象将文件上传到服务器的示例:

function handleFile(url, file) {
  let data = new FormData();
  data.append("file", file); // "file" 是后端接收文件的 key

  fetch(url, {
    method: "POST", // 通常使用 POST 上传文件
    body: data,
  })
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.text(); // 或者 response.json(),如果服务器返回 JSON
  })
  .then(result => {
    console.log("Upload successful:", result);
  })
  .catch(error => {
    console.error("Upload failed:", error);
  });
}

// 获取文件输入元素
const fileInput = document.getElementById("fileInput");

// 添加事件监听器,当选择文件时触发
fileInput.addEventListener("change", function() {
  const file = this.files[0];
  if (file) {
    const uploadUrl = "/upload"; // 替换为你的上传 URL
    handleFile(uploadUrl, file);
  }
});

注意事项:

  • 错误处理: 在实际应用中,需要添加更完善的错误处理机制,例如检查文件大小、类型等。
  • 安全性: 确保对上传的文件进行安全检查,以防止恶意文件上传。
  • 资源限制: 根据服务器的硬件资源,合理设置 ParseMultipartForm 的内存限制。
  • 存储: 选择合适的存储方式,例如本地磁盘、云存储等。
  • Content-Type: 前端必须正确设置 Content-Type 为 multipart/form-data。 fetch API 会自动处理,但如果是手动构建请求,需要注意。

总结

通过使用 net/http 包和 request.ParseMultipartForm 函数,可以轻松地处理 Golang 中的大文件上传。 理解 Expect: 100 Continue 机制并正确处理客户端请求,可以提高服务器的性能和用户体验。 记住,安全性、错误处理和资源限制是构建健壮的文件上传解决方案的关键因素。 最后,选择合适的存储方式,确保文件能够安全可靠地存储。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

343

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

240

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

193

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

438

2025.06.17

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号