GO语言实现文件上传的示例代码

yizhihongxing

来讲解一下“GO语言实现文件上传的示例代码”的完整攻略,过程中包含两条示例说明。

一、前言

文件上传是我们在 Web 开发过程中经常遇到的需求之一,那么在 GO 语言中如何实现文件上传呢?

二、基本原理

文件上传的基本原理就是前端将文件通过表单提交到后台,后台再将文件写入指定的目录中,在 GO 语言中可以通过 net/http 包的 ListenAndServehttp.HandleFunc 函数实现文件上传。

具体而言,前端通过 HTML 表单将文件上传至后台,后台通过 multipart/form-data 解析读取文件,再利用 io.Copy 函数写入指定目录,即可完成文件上传的功能。

三、示例说明

1. 单文件上传

func main() {
    http.HandleFunc("/upload", func(writer http.ResponseWriter, request *http.Request) {
        if request.Method == "POST" {
            file, handler, err := request.FormFile("file")
            if err != nil {
                fmt.Println("Error Retrieving the File")
                fmt.Println(err)
                return
            }
            defer file.Close()
            fmt.Printf("Uploaded File: %+v\n", handler.Filename)
            fmt.Printf("File Size: %+v\n", handler.Size)
            fmt.Printf("File MIME Header: %+v\n", handler.Header)
            // Create a file to store file data
            dst, err := os.Create(handler.Filename)
            if err != nil {
                fmt.Println(err)
                return
            }
            defer dst.Close()
            // Copy the uploaded file to the created file
            if _, err := io.Copy(dst, file); err != nil {
                fmt.Println(err)
                return
            }
            fmt.Fprintf(writer, "File uploaded successfully : ")
            fmt.Fprintf(writer, handler.Filename)
        } else {
            fmt.Fprintf(writer, "Error : Unexpected request type")
        }
    })
    http.ListenAndServe(":8000", nil)
}

上述代码实现了单文件上传,用户通过 HTML 表单上传文件,后端接收文件并存储到本地,同时返回存储的文件名。

2. 多文件上传

func MultipleUploads(writer http.ResponseWriter, request *http.Request) {
    if request.Method != "POST" {
        writer.WriteHeader(http.StatusBadRequest)
        writer.Write([]byte("Error: Unexpected request type"))
        return
    }
    // Set max allowed memory
    request.ParseMultipartForm(2 * 1024 * 1024)  // 2 MB
    // Get file headers
    files := request.MultipartForm.File["files"]
    // Create directory for storing files
    os.MkdirAll("./uploads", os.ModePerm)
    for _, fileHeader := range files {
        // Open file
        file, err := fileHeader.Open()
        defer file.Close()
        if err != nil {
            writer.WriteHeader(http.StatusInternalServerError)
            writer.Write([]byte(fmt.Sprintf("Error: Opening file: %s", fileHeader.Filename)))
            return
        }
        // Create destination file
        destinationFile, err := os.Create(fmt.Sprintf("./uploads/%s", fileHeader.Filename))
        defer destinationFile.Close()
        if err != nil {
            writer.WriteHeader(http.StatusInternalServerError)
            writer.Write([]byte(fmt.Sprintf("Error: Creating file: %s", fileHeader.Filename)))
            return
        }
        // Copy file
        _, err = io.Copy(destinationFile, file)
        if err != nil {
            writer.WriteHeader(http.StatusInternalServerError)
            writer.Write([]byte(fmt.Sprintf("Error: Copying file=%s - %v", fileHeader.Filename, err)))
            return
        }
        writer.Write([]byte(fmt.Sprintf("File uploaded successfully: %s\n", fileHeader.Filename)))
    }
}

上述代码实现了多文件上传,将文件保存在本地 ./uploads 目录下,同时返回上传成功的文件名,文件数不限。

四、总结

本文讲解了 GO 语言实现文件上传的示例代码,其中包含了单文件上传和多文件上传的示例说明。开发者可以根据需求选择适合自己的代码实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:GO语言实现文件上传的示例代码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 递归删除一个节点以及该节点下的所有节点示例

    递归删除一个节点以及该节点下的所有节点是一种常见的树操作。下面我将详细讲解如何实现这个过程。 1. 准备工作 在进行删除操作之前,我们需要先了解一下树的基本结构和节点表示方法。在树的结构中,每个节点包含一个数据元素和若干指向其子节点的指针。我们可以用一个指向根节点的指针来访问一棵树,并通过子节点指针遍历整个树。 2. 实现递归删除 下面,我们将详细讲解如何实…

    other 2023年6月27日
    00
  • Win10鼠标右键一直转圈怎么办?Win10鼠标右键一直转圈的解决方法

    Win10鼠标右键一直转圈通常是由于系统文件损坏或错误、系统更新、软件冲突等原因导致的。下面是解决方法的详细讲解。 方法一:更新或修复系统文件 这是最常见的解决办法之一,可以通过系统自带的命令行工具修复系统文件。进入命令提示符(管理员权限),输入以下命令: sfc /scannow 等待一段时间后,系统会自动扫描并修复损坏的系统文件。如果此时还有问题,可以再…

    other 2023年6月27日
    00
  • js的from方法和fill方法

    JS的from方法和fill方法 介绍 在JavaScript中,数组是一种常用的数据结构。从ES6开始,JavaScript为数组提供了一些新的方法,其中包括了from和fill方法。 from方法 from方法是用来将其他数据类型转换成数组的。它接收一个可迭代对象或类数组对象作为参数,返回一个新的数组对象,这个数组包含了传入对象的所有元素。 我们来看一下…

    其他 2023年3月28日
    00
  • 详解Linux iptables 命令

    详解Linux iptables 命令 介绍 iptables 是 Linux 系统上一个非常强大的防火墙功能,它可以用于限制进出网络流量,允许或者禁止特定的软件端口连接等。本文将详细讲解 iptables 的常见用法和示例说明。 命令格式 iptables 命令格式如下: iptables [-t 表名][-L][规则链名][选项] 其中: 表名有 fil…

    other 2023年6月26日
    00
  • Laravel自动生成UUID,从建表到使用详解

    下面是“Laravel自动生成UUID,从建表到使用详解”的完整攻略。 1. 什么是UUID UUID是Universally Unique Identifier(通用唯一标识符)的缩写,是一种标准的32位数字和字母的组合,可以用来唯一标识一个实体,与数据类型无关,具有唯一性和跨平台性。在Laravel中,可以使用UUID来替代自增长的id作为模型的主键。 …

    other 2023年6月27日
    00
  • 浅谈AngularJs指令之scope属性详解

    浅谈AngularJs指令之scope属性详解 AngularJS是一种流行的JavaScript框架,它提供了一种方便的方式来构建Web应用程序。在AngularJS中,指令是一种非常重要的概念,它允许我们扩展HTML并添加自定义行为。其中,scope属性是指令中一个非常重要的属性,它定义了指令的作用域。 scope属性的作用 scope属性用于定义指令的…

    other 2023年8月20日
    00
  • 最好用的web端代码文本编辑器ace

    最好用的Web端代码文本编辑器ACE 在Web端开发过程中,代码编写是必不可少的一环。因此,选择一款可靠且易于使用的代码文本编辑器显得尤为重要。在众多的 Web端代码文本编辑器中,ACE 是一种高度可定制的文本编辑器,并且具有丰富的功能和与众不同的优点。 ACE 的优点 易于定制 ACE 提供了一系列 API,使其可以完全在客户端进行定制和扩展。您可以通过插…

    其他 2023年3月28日
    00
  • Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    下面是Java实现的二叉树常用操作的完整攻略: 前置知识 在学习本攻略之前,需要掌握以下基础知识: Java的基本语法以及面向对象编程的理解 二叉树的定义与性质 二叉树的定义 二叉树是一种树状结构,其中每个节点最多有两个子节点。二叉树的定义如下: class TreeNode { int val; TreeNode left; TreeNode right;…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部