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>
测试一下
程序后台执行情况:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)