Go语言操作文件上传和下载应用教程

Go语言操作文件上传和下载应用教程

我们在使用Go的日常开发中,经常会遇到对文件的处理,例如:上传、下载、读写等(详情见Go 文件操作基本方法大全),且我们在实际应用中,基本都是使用框架自带的文件处理功能,但是在熟悉一个语言的过程中,我们有时更应该关注原生底层实现的原理,了解这个语言底层是如何实现的,所以接下来我们来了解一下,文件上传和下载用原生库来实现上述功能,本文将详细介绍如何使用Go标准库中的net/http包来实现文件的上传和下载功能。

一、文件上传

使用WEB端做示例,在WEB端中文件上传通常通过HTTP的POST请求完成,请求中包含multipart/form-data类型的表单数据。

1. HTML 表单设计

首先,你需要一个HTML表单来允许用户选择文件并上传。这个表单的enctype属性必须设置为multipart/form-data

html 复制代码
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>
2. Go 服务器处理

在Go的HTTP服务器中,你需要处理/upload路由,并读取表单中的文件数据。

go 复制代码
package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    // 设置最大内存大小
    err := r.ParseMultipartForm(32 << 20) // 32 MB
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // 获取文件
    file, handler, err := r.FormFile("file")
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    defer file.Close()

    // 创建本地文件
    f, err := os.Create(handler.Filename)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer f.Close()

    // 复制文件内容
    _, err = io.Copy(f, file)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    fmt.Fprintf(w, "File uploaded successfully")
}

func main() {
    http.HandleFunc("/upload", uploadHandler)
    http.ListenAndServe(":8080", nil)
}

在这个例子中,服务器首先调用r.ParseMultipartForm来解析请求中的表单数据,然后使用r.FormFile获取文件句柄。文件被存储在服务器的指定路径下。

二、文件下载

文件下载通常通过HTTP的GET请求完成,服务器返回文件内容并设置相应的HTTP头信息。

Go 服务器处理

在Go的HTTP服务器中,你需要处理特定的路由,读取本地文件,并将其内容发送给客户端。

go 复制代码
package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func downloadHandler(w http.ResponseWriter, r *http.Request) {
    // 设置文件名和文件路径
    fileName := "test.txt"
    filePath := "./" + fileName

    // 打开文件
    file, err := os.Open(filePath)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer file.Close()

    // 设置响应头
    w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
    w.Header().Set("Content-Type", "text/plain")

    // 发送文件内容
    _, err = io.Copy(w, file)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

func main() {
    http.HandleFunc("/download", downloadHandler)
    http.ListenAndServe(":8080", nil)
}

在这个例子中,服务器设置了响应头中的Content-Dispositionattachment,以指示浏览器下载文件,而不是尝试打开它。然后,服务器读取本地文件的内容,并将其写入响应体中。

三、总结

本文介绍了如何在Go语言中使用net/http包来实现文件的上传和下载功能。通过HTML表单上传文件,并在Go的HTTP服务器中处理文件存储和发送逻辑。对于下载,通过设置HTTP响应头并发送文件内容来触发浏览器下载文件。

相关推荐
2603_965148116 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
知无不研9 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_291410 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈11 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_4480111611 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据11 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡12 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai12 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间12 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋12 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty