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

news2024/9/22 1:33:09

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

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

一、文件上传

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

1. HTML 表单设计

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

<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路由,并读取表单中的文件数据。

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服务器中,你需要处理特定的路由,读取本地文件,并将其内容发送给客户端。

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响应头并发送文件内容来触发浏览器下载文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(Java实现):链表习题

文章目录 1. 题目列表及链接2. 题目解析及代码2.1 删除链表中等于给定值 val 的所有节点2.2 反转一个单链表2.3 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点2.4 输入一个链表&#xff0c;输出该…

Edge浏览器:Github加速插件,让你在国内自由自在的访问Github!

你是否有访问GitHub要么超级慢&#xff0c;要么无法访问的时刻&#xff0c;是不是感觉痛苦不已&#xff1b; 现在给大家分享我解决问题的方法。 点击浏览器右上角的三个点【…】按钮&#xff0c;然后选择【扩展】 选择【管理扩展】 点击【获取 Miscrosoft Edge扩展】 在搜索框…

解决方案:在jupyter notebook环境下安装不了numpy

文章目录 一、现象二、解决方案 一、现象 平台&#xff1a;autodl 镜像&#xff1a;PyTorch 2.0.0 Python 3.8(ubuntu20.04) Cuda 11.8 GPU&#xff1a;RTX 4090(24GB) * 1 CPU&#xff1a;12 vCPU Intel Xeon Platinum 8352V CPU 2.10GHz 内存&#xff1a;90GB 安装numpy环…

推荐两款好用的录屏软件

Ocam oCam 是一款功能强大的屏幕录制软件&#xff0c;主要用于录制电脑屏幕上的活动。它支持多种视频格式&#xff0c;包括 AVI、MP4、FLV、MOV、TS 和 VOB&#xff0c;同时也支持多种音频格式&#xff0c;如 MP3。oCam 可以录制视频并保存为各种视频格式&#xff0c;还可以编辑…

绘剪批量软件——绘剪批量软件

批量软件是一种可以批量处理大量数据或操作的软件。它通常通过自动化的方式&#xff0c;快速高效地完成任务&#xff0c;减少人工操作的时间和工作量。批量软件可以用于数据处理、文件转换、批量重命名、批量下载等各种场景。 绘剪批量软件——绘剪TK批量软件 AIWYZ77 批量软…

前端JS——补充内容

这期是番外篇&#xff0c;主要是补充一下&#xff0c;之前没有说完整的内容。 后面两期太仓促了&#xff0c;一些值得注意的细节没有提到 之前的内容可以点击&#xff1a; JS总结上 JS总结中 JS总结下——DOM操作 JS总结下——事件操作 前面的两篇总结没什么好补充的&…

[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

目录 1.mari和shiny1.题目链接2.算法原理详解 && 代码实现 2.重排字符串1.题目链接2.算法原理详解 && 代码实现 1.mari和shiny 1.题目链接 mari和shiny 2.算法原理详解 && 代码实现 自己的版本&#xff1a;三层循环暴力枚举 --> 超时 --> 40% …

[项目]-通讯录的实现

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天来结合前面所学知识点&#xff0c;写一个能够增删改查&#xff0c;持久化数据的通讯录功能 准备工作 项目 一般会写成多个文件来实现&#xff0c;调用&#xff0c;接口声明&#xff0c;接口实现&#xff0c;这是一…

游戏开发设计模式之组件模式

目录 组件模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在Unity引擎中实现和优化组件模式&#xff1f; 组件模式与其他设计模式&#xff08;如观察者模式、状态模式&#xff09;在游戏开发中的比较优势在哪里&#xff1f; 组件模式 观察者模式 状态模式 综合比…

【python】OpenCV—Single Human Pose Estimation

文章目录 1、Human Pose Estimation2、模型介绍3、基于图片的单人人体关键点检测4、基于视频的单人人体关键点检测5、左右校正6、关键点平滑7、涉及到的库函数scipy.signal.savgol_filter 8、参考 1、Human Pose Estimation Human Pose Estimation&#xff0c;即人体姿态估计&…

通过主成分分析实现检测金融中的异常交易模式

主成分分析&#xff08;PCA&#xff09;是一种在机器学习和数据科学中广泛使用的降维技术。它的主要目的是将高维数据转换为低维数据&#xff0c;同时尽可能保留原始数据中的信息。以下是PCA的一些关键点&#xff1a; 1. 基本概念&#xff1a;PCA的核心思想是将n维特征映射到k维…

5步实现猫眼电影爬虫与k-means算法可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

C#二叉搜索树算法

二叉搜索树算法实现原理 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种节点有序排列的二叉树数据结构。它具有以下性质&#xff1a; 每个节点最多有两个子节点。 对于每个节点&#xff0c;其左子树的所有节点值都小于该节点值&#xff0c;…

MySQL数据库连接超时问题排查报告

1、问题描述 边端设备访问云端过程中有概率出现MySQL数据库连接超时报错&#xff0c;具体报错代码如下&#xff1a; [2024-08-13 13:47:44,036] ERROR in app: Exception on /est-tasks/start [POST] Traceback (most recent call last): File "/usr/local/lib/python3.1…

Java 入门指南:Map 接口

Map 接口是 Java 集合框架中的一个接口&#xff0c;它表示了一种键值对的映射关系。Map 接口提供了一种以键为索引的数据结构&#xff0c;通过键可以快速查找对应的值。在 Map 中&#xff0c;每个键只能对应一个值&#xff0c;键是唯一的&#xff0c;但值可以重复。 常用的实现…

在vscode上便捷运行php文件

目录 前言 1. 准备工作 2. 创建文件 3. 下载插件 4.设置访问配置文件 5. 配置默认浏览器 6. 进行验证 前言 对于学习安全的我们来说,部署环境,靶场,和配置环境都是习以为常的一件事情,平时访问靶场都是通过小皮来,今天突想着最近需要对一些漏洞的原理进行研究,所以需要能够…

ESP-WHO C++程序分析基础(七)

以按键部分的程序做为分析基础 先看app_button.hpp文件&#xff0c;文件的路径如下 examples/esp32-s3-eye/main/include/app_button.hpp // AppButton 类&#xff0c;继承自 Subject 类&#xff0c;表示应用程序按钮 首先是先定义了一个 appbutton的按键类&#xff0c;这个…

【计算机组成原理】汇总三、存储系统

三、存储系统&#xff08;存储器层次结构&#xff09; 文章目录 三、存储系统&#xff08;存储器层次结构&#xff09;1.存储器的分类1.1按在计算机中的作用&#xff08;层次&#xff09;❗多级存储结构&#xff08;层次化结构&#xff09;1.2按存储介质1.3按存取方式1.4按信息…

抢单源码修正版,带教程,自动抓取订单,十几种语言可自动切换

亚马逊抢单源码自动抓取订单任务邀请英文,西班牙语可自动切换语言亲测修正版。带完整开源的前后台。 西班牙,英文&#xff0c;巴西&#xff0c;中文&#xff0c;德国&#xff0c;拉法兰西&#xff0c;荷兰&#xff0c;缅甸&#xff0c;Sverige&#xff0c;日本&#xff0c;Trk…

C_02基础学习

c 语言 基础 gcc编译器 作用: 将代码文件编译为可执行文件 分类: 一步到位gcc 要编译的代码文件 -o 生成的可执行文件注意:要编译的代码文件可以是多个-o 生成的可执行文件:可以忽略不写,默认生成a.out文件 分步实现预编译:头文件展示,宏替换,选择型编译gcc -E 要编译的代码…