GO语言原生实现文件上传功能
作者:Sirius_7 发布时间:2023-10-17 08:29:39
标签: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>
测试一下
程序后台执行情况:
来源:https://blog.csdn.net/weixin_38107316/article/details/111132385
0
投稿
猜你喜欢
- 代理服务原理很简单,就拿浏览器与web服务器来说。无非是A浏览器发request给B代理,B代理再把request把送给C web服务,然后
- XMLHttpRequest 最近在 W3C 标准之路上又迈进了一步,W3C Web API&nbs
- 本文实例讲述了RSA实现JS前端加密与PHP后端解密功能。分享给大家供大家参考,具体如下:web前端,用户注册与登录,不能直接以明文形式提交
- HTML与CSS在Flash中的应用:不小心看到同事Den在弄个小东西:在Flash里使用HTML和CSS,代码是这样:var m
- 本文实例讲述了go语言睡眠排序算法。分享给大家供大家参考。具体分析如下:睡眠排序算法是一个天才程序员发明的,想法很简单,就是针对数组里的不同
- 在没步入正轨之前,先给大家介绍JavaScript 特殊字符你可以在 JavaScript 中使用反斜杠来向文本字符串添加特殊字符。插入特殊
- 我们以用户查询语句为 https://www.aspxhome.com/chunfeng.asp为例来查询用户资料将从数据库Contact1
- 选择自 xinyuxin912 的 Blog将一个图片以二进制值的形式存入Xml文件中try { &nbs
- 首先说登陆在config.inc.php文件中,有一个选项需要设置查找:$cfg['Servers'][$i]['a
- 本文实例讲述了python处理图片之PIL模块简单使用方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env pytho
- 函数初解function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中实现代码的重复利用函数定义语法:关键点:fun
- 有的时候,我们为了保持网页的美观,需要将较长的文字在一定长度时截断。比如我们希望在列表中显示文章标题的前15个字,那么一个这样的标题:“rs
- /* 小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记
- 人一旦习惯了某些东西就很难去改,以及各种各样的原因,新的浏览器越来越多,而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题
- 许可和分发权限Access 2003 Developer Extensions随附的许可协议简化了解决方案或代码段的分发过程。这些协议包括免
- 一般写ASP PHP代码的朋友都估计是采用直接操作SQL的吧~ 看以下的代码 <% dim conn,rs&nbs
- 尽管有很多规范URL的标准,例如RFC 3987,但实际应用中却非常混乱。本文主要介绍浏览器发送URL到服务器的一些特性,作为开发和应用的参
- div+css实现圆角边框,在网络上查看了一下,很多都是实现圆角的矩形的方法,我在这里介绍的是实现圆角矩形边框的方法。用代码说明问题:<
- 问:握怎样测试 MySQL安装?答:可以通过以下命令测试MySQL服务器是否工作:C:\> C:\Program Files\MySQ
- 代码如下:---1.平均销售等待时间 ---有一张Sales表,其中有销售日期与顾客两列,现在要求使用一条SQL语句实现计算 --每个顾客的