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>

测试一下

程序后台执行情况:

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

相关文章

  • golan参数校验Validator

    golan参数校验Validator

    这篇文章主要介绍了golan参数校验Validator,validator包可以通过反射结构体struct的tag进行参数校验,下面来看看文章的详细介绍吧,需要的朋友也可以参考一下
    2021-12-12
  • Go设计模式之代理模式图文详解

    Go设计模式之代理模式图文详解

    这篇文章将通过图文讲解给大家详细的介绍一下Go代理模式,代理模式是一种结构型设计模式,代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • 重学Go语言之如何使用Modules

    重学Go语言之如何使用Modules

    Go语言在Go.1.11版本发布了Go Modules,这是一种新的Go项目依赖管理解决方案,可以让Go项目的依赖包关系更加清晰,也更容易管理,下面就来看看Modules是如何使用的吧
    2023-07-07
  • Golang如何快速删除map所有元素

    Golang如何快速删除map所有元素

    这篇文章主要介绍了Golang如何快速删除map所有元素问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Golang并发编程之调度器初始化详解

    Golang并发编程之调度器初始化详解

    这篇文章主要为大家详细介绍了Golang并发编程中关于调度器初始化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • Go语言写入字符串到文件的方法

    Go语言写入字符串到文件的方法

    这篇文章主要介绍了Go语言写入字符串到文件的方法,实例分析了Go语言操作字符串及文本的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • golang实践-第三方包为私有库的配置方案

    golang实践-第三方包为私有库的配置方案

    这篇文章主要介绍了golang实践-第三方包为私有库的配置方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang项目搭配nginx部署反向代理负载均衡讲解

    Golang项目搭配nginx部署反向代理负载均衡讲解

    这篇文章主要为大家介绍了Golang项目搭配nginx部署正反向代理负载均衡讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go使用sync.Map来解决map的并发操作问题

    Go使用sync.Map来解决map的并发操作问题

    在 Golang 中 map 不是并发安全的,sync.Map 的引入确实解决了 map 的并发安全问题,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-10-10
  • Golang开发之字符串与切片问题踩坑记录

    Golang开发之字符串与切片问题踩坑记录

    字符串和切片,都是golang常用的两种内置数据类型,最近在日常工作中,遇到了一个字符串切片导致的问题,记录一下排查问题的过程,避免后续在这种场景上踩坑
    2023-07-07

最新评论