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

作者:Sirius_7 时间:2023-10-17 08:29:39 

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

测试一下

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

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

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

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

程序后台执行情况:

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

来源:https://blog.csdn.net/weixin_38107316/article/details/111132385

标签:GO,文件上传
0
投稿

猜你喜欢

  • MYSQL事务的隔离级别与MVCC

    2024-01-20 10:59:48
  • MySQL ERROR 1045 (28000) 错误的解决办法

    2024-01-16 18:49:06
  • Python字符串字母大小写转换的各种情况详析

    2023-11-23 07:35:41
  • 快速解决百度编译器json报错的问题

    2023-04-08 16:20:17
  • Python3 中sorted() 函数的用法

    2021-09-29 04:00:55
  • python 遍历pd.Series的index和value

    2021-12-27 15:50:42
  • Python数据结构之翻转链表

    2023-05-27 20:09:11
  • CSS改变字体而不影响网页

    2010-10-20 20:11:00
  • JS中ESModule和commonjs介绍及使用区别

    2023-10-20 22:23:51
  • python之json文件转xml文件案例讲解

    2021-11-18 04:54:23
  • python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现

    2023-07-25 16:29:47
  • Python实现五子棋人机对战 和人人对战

    2023-01-14 07:59:52
  • python中pylint使用方法(pylint代码检查)

    2023-10-28 09:41:52
  • IDEA怎么切换Git分支的实现方法

    2022-10-11 14:20:21
  • python搭建虚拟环境的步骤详解

    2021-10-05 14:42:31
  • ElasticSearch核心概念

    2023-11-29 00:49:05
  • python+selenium对table表和分页处理

    2024-01-04 02:16:18
  • Chrome插件开发系列一:弹窗终结者开发实战

    2024-04-29 13:42:04
  • sql ntext数据类型字符替换实现代码

    2011-09-30 11:08:00
  • 对Python3中列表乘以某一个数的示例详解

    2023-05-05 03:10:40
  • asp之家 网络编程 m.aspxhome.com