首页 > 文章列表 > GO语言原生实现文件上传功能

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

golang
127 2022-12-17

本文实例为大家分享了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>

测试一下

程序后台执行情况: