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>

测试一下

程序后台执行情况:

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

相关文章

  • Hugo 游乐场内容初始化示例详解

    Hugo 游乐场内容初始化示例详解

    这篇文章主要为大家介绍了Hugo 游乐场内容初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Go语言Gin框架获取请求参数的两种方式

    Go语言Gin框架获取请求参数的两种方式

    在添加路由处理函数之后,就可以在路由处理函数中编写业务处理代码了,而编写业务代码第一件事一般就是获取HTTP请求的参数吧,Gin框架在net/http包的基础上封装了获取参数的方式,本文小编给大家介绍了获取参数的两种方式,需要的朋友可以参考下
    2024-01-01
  • Golang 语言高效使用字符串的方法

    Golang 语言高效使用字符串的方法

    这篇文章主要介绍了Golang 语言高效使用字符串的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解Go语言如何检查系统命令是否可用

    详解Go语言如何检查系统命令是否可用

    这篇文章主要为大家详细介绍了Go语言通过编写一个函数,利用Go语言标准库中的功能来检查系统命令是否可用,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 简单聊聊为什么说Go语言字符串是不可变的

    简单聊聊为什么说Go语言字符串是不可变的

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢,本文就来和大家简单讲讲
    2023-05-05
  • Golang的func参数及返回值操作

    Golang的func参数及返回值操作

    这篇文章主要介绍了Golang的func参数及返回值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go chassis云原生微服务开发框架应用编程实战

    Go chassis云原生微服务开发框架应用编程实战

    这篇文章主要为大家介绍了Go chassis云原生微服务开发框架应用编程实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言流程控制之goto语句与无限循环

    Go语言流程控制之goto语句与无限循环

    这篇文章主要介绍了Go语言流程控制之goto语句与无限循环,是golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • golang高并发的深入理解

    golang高并发的深入理解

    golang从语言级别上对并发提供了支持,而且在启动并发的方式上直接添加了语言级的关键字。下面这篇文章主要给大家介绍了关于golang高并发的相关资料,需要的朋友可以参考下
    2019-03-03
  • Golang websocket协议使用浅析

    Golang websocket协议使用浅析

    这篇文章主要介绍了Golang websocket协议的使用,WebSocket是一种新型的网络通信协议,可以在Web应用程序中实现双向通信,感兴趣想要详细了解可以参考下文
    2023-05-05

最新评论