Go语言实现文件上传
作者:书香水墨 发布时间:2023-07-08 18:26:38
标签:Go,文件上传
本文实例为大家分享了Go实现文件上传的具体代码,供大家参考,具体内容如下
文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进制流进行解析
HTML表单(form)enctype(Encode Type)属性控制表单在提交数据到服务器时数据的编码类型.
enctype=”application/x-www-form-urlencoded” 默认值,表单数据会被编码为名称/值形式
enctype=”multipart/form-data” 编码成消息,每个控件对应消息的一部分.请求方式必须是post
enctype=”text/plain” 纯文本形式进行编码的
HTML模版内容如下(在项目/view/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="upload" enctype="multipart/form-data" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="file" name="photo"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
服务端可以使用FormFIle(“name”)获取上传到的文件,官方定义如下
// FormFile returns the first file for the provided form key.
// FormFile calls ParseMultipartForm and ParseForm if necessary.
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) {
if r.MultipartForm == multipartByReader {
return nil, nil, errors.New("http: multipart handled by MultipartReader")
}
if r.MultipartForm == nil {
err := r.ParseMultipartForm(defaultMaxMemory)
if err != nil {
return nil, nil, err
}
}
if r.MultipartForm != nil && r.MultipartForm.File != nil {
if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
f, err := fhs[0].Open()
return f, fhs[0], err
}
}
return nil, nil, ErrMissingFile
}
multipart.File是文件对象
// File is an interface to access the file part of a multipart message.
// Its contents may be either stored in memory or on disk.
// If stored on disk, the File's underlying concrete type will be an *os.File.
type File interface {
io.Reader
io.ReaderAt
io.Seeker
io.Closer
}
封装了文件的基本信息
// A FileHeader describes a file part of a multipart request.
type FileHeader struct {
Filename string //文件名
Header textproto.MIMEHeader //MIME信息
Size int64 //文件大小,单位bit
content []byte //文件内容,类型[]byte
tmpfile string //临时文件
}
服务器端编写代码如下
获取客户端传递后的文件流,把文件保存到服务器即可
package main
import (
"net/http"
"fmt"
"html/template"
"io/ioutil"
)
/*
显示欢迎页upload.html
*/
func welcome(rw http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("template/html/upload.html")
t.Execute(rw, nil)
}
/*
文件上传
*/
func upload(rw http.ResponseWriter, r *http.Request) {
//获取普通表单数据
username := r.FormValue("username")
fmt.Println(username)
//获取文件流,第三个返回值是错误对象
file, header, _ := r.FormFile("photo")
//读取文件流为[]byte
b, _ := ioutil.ReadAll(file)
//把文件保存到指定位置
ioutil.WriteFile("D:/new.png", b, 0777)
//输出上传时文件名
fmt.Println("上传文件名:", header.Filename)
}
func main() {
server := http.Server{Addr: "localhost:8899"}
http.HandleFunc("/", welcome)
http.HandleFunc("/upload", upload)
server.ListenAndServe()
}
来源:https://blog.csdn.net/qq_27870421/article/details/118494346


猜你喜欢
- 本文实例讲述了Python使用matplotlib实现交换式图形显示功能。分享给大家供大家参考,具体如下:一 代码from random i
- 使用原生SQL语句进行对数据库操作,可完成数据库表的建立和删除,及数据表内容的增删改查操作等。其可操作性很强,如可以直接使用“show da
- 自从接触python以后就想着爬pixiv,之前因为梯子有点问题就一直搁置,最近换了个梯子就迫不及待试了下。爬虫无非request获取htm
- 如何编写一个只在Web服务关闭时执行的程序?如:<SCRIPT LANGUAGE="VBScript"&
- 1. 不使用全局变量,适当封装2. 兼容性还行~~3. 代码短,可读性凑合~~呵呵~~~~~a. 拖动效果,16行JS<!DOCTYP
- 环境 : Debian 6.02 (squeeze) x64 软件:MySQL 5.5.14 步骤: 1、升级系统 #apt-get upd
- 最近,Node.js 和 Python 都因其广泛的特性和功能在市场上大受欢迎。在你开发Web应用程序的后端时,这两种技术都是你的首选。众所
- 前言图像分割是指根据灰度、色彩、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域。最简单的图像分割就是将物体从背景中分割出来1.图像
- 问题描述前端时间在公司的时候,要使用angular开发一个网站,因为angular很适合前后端分离,所以就做了一个简单的图书管理系统来模拟前
- python3中,list有个reverse函数,用来反转列表元素,但是如果想要反转部分元素呢?a = [1,2,3,4,5]a[0:3].
- Vue是当下很流行的前端框架,现在我来分享一下用Vue创建项目的流程1、新建一个文件夹,用来创建Vue项目。2、进入到该文件夹,在地址栏内写
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:jquery读取xml文件 <!DOCTYPE html PUBLIC "
- 最近在上《自然语言处理》这门选修课,为了完成上机作业也是很认真了,这次是为了实现语角色标注任务,于是就入了这个坑,让我们来(快乐地 )解决出
- 本文实例讲述了Python让字典保持有序的方法。分享给大家供大家参考,具体如下:问题:创建一个字典,同时对字典做迭代或序列化操作时,也能控制
- 导言在前面的教程里我们学习了DataList提供了一些风格样式的属性.而且我们还学习了如何定义HeadStyle, ItemStyle, A
- 在内容为主的网站中,搜索框往往是最常用的设计元素之一。从可用性的角度来看,搜索功能是用户有了明确的内容想看的时候最后使用的功能。如果一个网站
- 在 CentOS7 中我们在安装 MySQL 的话会默认安装的是 MariaDB。它是一个在 MySQL 被收购之后,作者推出的应一个开源版
- 前言Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重
- PyTorch中数据读取的一个重要接口是torch.utils.data.DataLoader,该接口定义在dataloader.py脚本中
- 别人复制你网站的文章时自动加上注释,这个功能你在很多网站应该都有体会过,当我们复制一段内容时,就自动在文章后面加上了网站的一些