文件上传和文件下载--Go语言学习笔记
Posted 旧时星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传和文件下载--Go语言学习笔记相关的知识,希望对你有一定的参考价值。
文件上传和文件下载–Go语言学习笔记
###文件上传
-
文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进制进行解析
-
html表单属性控制表单在提交数据到服务器时数据的编码类型
- enctype="application/x-www-form-urlencoded"默认值,表单数据会被编码为名称/值形式
- enctype="multipart/form-data"编码成消息,每个控件对应消息的一部分,请求方式必须是post
- enctype="text/plain"纯文本形式进行编码的
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>
HTML前端页面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
- 服务端可以使用FormFile(“name”)获取上传到的文件
Go后端代码
func upload(w http.ResponseWriter,r *http.Request){ fileName:=r.FormValue("name")//formValue正常获取表单数据 file,fileHeader,_:=r.FormFile("file")//formfile获取文件信息 b,_:=ioutil.ReadAll(file) //ioutil.ReadAll读取file的所有数据 ioutil.WriteFile("D:/"+fileName+fileHeader.Filenamek[strings.LastIndex(fileHeader.Filename,"."):],b,0777)//io.writefile将文件写出到指定位置 0777使得文件具有读写和执行的权限 t,_:=template.ParseFiles("view/success.html") t.Execute(w,nil) }
文件下载
- 文件下载总体步骤
- 客户端向服务端发起请求,请求参数包含要下载文件的名称
- 服务器接收到客户端请求后把文件设置到响应对象中,响应给客户端浏览器
- 下载时需要的响应头信息
- Content-Type:内容MIME类型
- Content-Disposition:客户端对内容的操作方式
- inline 默认值,表示浏览器能解析就解析,不能解析下载
- attachment;filename=下载时显示的文件名,客户端浏览器恒下载
HTML前端代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="download?filename=abc.png">下载 {/*该为所下载文件的链接,下载时由该数据参数获取对应信息,若服务器端并无该链接名称的文件则在go后端中会打印错误信息 */} </a> </body> </html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3SwNnbxn-1625754491414)
go后端:
func welcome(w http.ResponseWriter,r *http.Request){ t,_:=template.ParseFiles("view/H7.html") t.Execute(w,nil) }
welcome用来显示下载页面,点击链接进行下载
download用来获取服务器端对应链接文件,若链接对应文件名的文件存在则使用ioutil流下载对应服务器端文件,否则输出错误信息。
func dowmload(w http.ResponseWriter,r *http.Request){ //获取请求参数 filename:=r.FormValue("filename") //使用ioutil包读取文件 f,err:=ioutil.ReadFile("D:/gofile/"+filename) if err!=nil{ fmt.Fprintln(w,"文件下载失败,",err) return } h:=w.Header() h.Set("Content-Type","application/octet-stream") h.Set("Content-Disposition","attachment;filename="+filename) //写入到响应流中 w.Write(f) }
以上是关于文件上传和文件下载--Go语言学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — go工具(5.2): 基准测试 (性能测试)—— 获得代码内存占用和运行效率的性能数据