亲宝软件园·资讯

展开

GO文件上传功能

Sirius_7 人气:0

写在前面

最近在学习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>

测试一下

程序后台执行情况:

加载全部内容

相关教程
猜你喜欢
用户评论