文件上传和文件下载--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): 基准测试 (性能测试)—— 获得代码内存占用和运行效率的性能数据

go学习Golang底层学习笔记

go学习Golang底层学习笔记

JAVAWEB学习笔记29_文件的上传------commons-fileupload

struts2学习笔记--上传单个和批量文件示例

Go语言命令行复习笔记