GO语言原生实现文件上传功能

 更新时间:2022年07月26日 09:52:30   作者:Sirius_7  
这篇文章主要为大家详细介绍了GO语言原生实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了GO原生实现文件上传功能的具体代码,供大家参考,具体内容如下

写在前面

最近在学习go,发现实践才是检验真理的唯一标准。在不引入任何框架的基础上,利用go语言实现一个web小应用也是比较方便的,但是坑还是不少,这里直接放上来,以防以后自己用得到,也希望可以帮到你。

首先写处理文件上传的handler

package handler

/**
实现文件的上传和下载
*/
import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
)

//文件上传(这里一定要注意,方法名首字母大写,否则无法在别的包中被引用发现)
func UploadHandler(w http.ResponseWriter, r *http.Request) {
    //这里的输出数字是为了等下等直观的感受程序运行的过程,后面输出的数字功能类似
    fmt.Printf("4")
    //首次访问指定url默认采用GET方法提交,所以需要调出提交文件表单页面
    if r.Method == "GET" {
        fmt.Printf("5")
        //通过读取html文件再交由http.ResponseWriter输出的方式实现文件提交页面的唤出
        data, err := ioutil.ReadFile("static/view/index.html")
        if err != nil {
            _, _ = io.WriteString(w, "something wrong!")
            return
        }
        _, _ = io.WriteString(w, string(data))
    } else if r.Method == "POST" {
        fmt.Printf("6")
        //将文件存储至本地
        file, head, err := r.FormFile("file")

        if err != nil {
            fmt.Printf("Failed to get file data %s\n", err.Error())
            return
        }
        defer file.Close()
        //在本地创建一个新的文件去承载上传的文件
        newFile, err := os.Create("/tmp/" + head.Filename)
        if err != nil {
            fmt.Printf("Failed to create newFile data %s\n", err.Error())
            return
        }

        defer newFile.Close()
        _, err = io.Copy(newFile, file)
        if err != nil {
            fmt.Printf("Failed to save into newFile %s\n", err.Error())
            return
        }
        // 重定向到成功的页面逻辑
        http.Redirect(w, r, "/file/upload/suc", http.StatusFound)
    }
}

// 文件上传成功处理逻辑
func UploadSucHandler(w http.ResponseWriter, r *http.Request) {
    _, _ = io.WriteString(w, "Upload Succeed!")
}

其次完成main方法,注册路由信息

所谓的注册路由信息,其实就是类似于java框架中配置url拦截规则,具体见下:

package main

import (
    "log"
    "net/http"
    "zone/src/handler"
)

func main() {
    //设置http的路由规则,类似于Java框架中设置请求拦截规则
    http.HandleFunc("/file/upload", handler.UploadHandler)
    http.HandleFunc("/file/upload/suc", handler.UploadSucHandler)
    //开启http监听
    //err := http.ListenAndServe(":8080", nil)
    //if err != nil {
    //    fmt.Printf("There is an err %s", err.Error())
    //}
    //上面方法不太优雅,现在用log直接包裹监听
    log.Fatal(http.ListenAndServe(":8081", nil))
}

最后完成前端文件提交页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
    <p><input type="file" name="file" value=""></p>
    <p><input type="submit" value="submit"></p>
</form>
</body>
</html>

测试一下

程序后台执行情况:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Golang中链表的创建和读取

    详解Golang中链表的创建和读取

    这篇文章主要为大家详细介绍了Golang中链表的创建和读取的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解下
    2023-12-12
  • GoFrame框架数据校验之校验对象校验结构体

    GoFrame框架数据校验之校验对象校验结构体

    这篇文章主要为大家介绍了GoFrame框架数据校验之校验对象校验结构体示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • GO语言基本类型String和Slice,Map操作详解

    GO语言基本类型String和Slice,Map操作详解

    这篇文章主要为大家介绍了GO语言基本类型String和Slice,Map操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang实现openssl自签名双向认证的详细步骤

    golang实现openssl自签名双向认证的详细步骤

    这篇文章主要介绍了golang实现openssl自签名双向认证的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • 深入了解Golang中的Slice底层实现

    深入了解Golang中的Slice底层实现

    本文主要为大家详细介绍了Golang中slice的底层实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-02-02
  • 源码剖析Golang如何fork一个进程

    源码剖析Golang如何fork一个进程

    创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,本文将从源码的角度带大家剖析一下Golang是如何fork一个进程的
    2023-06-06
  • Golang学习之内存逃逸分析

    Golang学习之内存逃逸分析

    内存逃逸分析是go的编译器在编译期间,根据变量的类型和作用域,确定变量是堆上还是栈上。本文将带大家分析一下Golang中的内存逃逸,需要的可以了解一下
    2023-01-01
  • go实现一个分布式限流器的方法步骤

    go实现一个分布式限流器的方法步骤

    项目中需要对api的接口进行限流,本文主要介绍了go实现一个分布式限流器的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 一文带你探索Go语言中crypto/md5标准库的强大功能

    一文带你探索Go语言中crypto/md5标准库的强大功能

    我们将从MD5算法的基础知识入手,逐步深入到如何在Go中有效使用crypto/md5标准库,包括基本的使用方法、实际应用案例分析,以及性能和安全性的考量,需要的可以参考下
    2024-02-02
  • Golang 如何解析和生成json

    Golang 如何解析和生成json

    这篇文章主要介绍了Golang 如何解析和生成json,帮助大家更好的理解和学习golang,感兴趣的朋友可以了解下
    2020-09-09

最新评论