Go实现文件上传和下载

2022-07-26 12:01:53

本文实例为大家分享了Go实现文件上传和下载的具体代码,供大家参考,具体内容如下

一.文件上传

文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进制流进行解析

HTML表单(form)enctype(Encode>

    enctype=”application/x-www-form-urlencoded” 默认值,表单数据会被编码为名称/值形式enctype=”multipart/form-data” 编码成消息,每个控件对应消息的一部分.请求方式必须是postenctype=”text/plain” 纯文本形式进行编码的

    HTML模版内容如下(在项目/view/index5.html)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <title>文件上传</title>
    </head>
    <body>
    <form action="upload" method="post" enctype="multipart/form-data">
    文件名:<input type="text" name="name"/><br/>
      文件:<input type="file" name="file"/><br/>
      <input type="submit" value="提交"/>
    </form>
    
    </body>
    </html>

    服务端go语言代码如下:

    package main
    
    import (
        "html/template"
        "net/http"
    )
    
    func test2(w http.ResponseWriter, r *http.Request)  {
        t,_:=template.ParseFiles("view/index5.html")
        t.Execute(w,nil)
    
    }
    func main() {
    server:=http.Server{Addr: ":8090"}
    http.HandleFunc("/",test2)
    server.ListenAndServe()
    }

    效果截图:

    在这里插入图片描述

    这比我之前学的Java Swing简便多了!
    获取客户端传递后的文件流,把文件保存到服务器即可,我们以上传一张照片为例。
    我们新增一个页面:文件上传成功,当我们上传成功时显示上传成功。

    html代码如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    文件上传成功
    </body>
    </html>

    此时,服务器端代码要保存接受的图片。
    服务器端代码如下:

    package main
    
    import (
        "html/template"
        "io/ioutil"
        "net/http"
        "strings"
    )
    
    func test2(w http.ResponseWriter, r *http.Request)  {
        t,_:=template.ParseFiles("view/index5.html")
        t.Execute(w,nil)
    
    }
    func upload(w http.ResponseWriter, r *http.Request)  {
        fileName:=r.FormValue("name")
        file,fileHeader,_:=r.FormFile("file")
        b,_:=ioutil.ReadAll(file)
        ioutil.WriteFile("D:/"+fileName+fileHeader.Filename[strings.LastIndex(fileHeader.Filename,"."):],b,0777)
        t,_:=template.ParseFiles("view/sucess.html")
        t.Execute(w,nil)
    }
    func main() {
    server:=http.Server{Addr: ":8090"}
    http.HandleFunc("/",test2)
    http.HandleFunc("/upload",upload)
    server.ListenAndServe()
    }

    操作如下图:

    第一步:输入文件名

    在这里插入图片描述

    第二步,选择文件:

    在这里插入图片描述

    第四步:按提交按钮:

    在这里插入图片描述

    最后,上传成功:

    在这里插入图片描述

    我们再来检查一下D盘:

    在这里插入图片描述

    上传成功!

    二.文件下载简介

    文件下载总体步骤

      客户端向服务端发起请求,请求参数包含要下载文件的名称服务器接收到客户端请求后把文件设置到响应对象中,响应给客户端浏览器

      载时需要设置的响应头信息

        Content-Type:>

        application/octet-stream 任意类型

          Content-Disposition:客户端对内容的操作方式

          inline 默认值,表示浏览器能解析就解析,不能解析下载
          attachment;filename=下载时显示的文件名 ,客户端浏览器恒下载

          html代码如下:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                  "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
              <title>文件下载</title>
          </head>
          <body>
          
          <a href="download?filename=abc.png">下载</a>
          </body>
          </html>

          go语言代码如下:

          package main
          
          import (
              "fmt"
              "html/template"
              "io/ioutil"
              "net/http"
          )
          
          func test2(w http.ResponseWriter, r *http.Request)  {
              t,_:=template.ParseFiles("view/index5.html")
              t.Execute(w,nil)
          
          }
          func downlaod(w http.ResponseWriter, r *http.Request)  {
              filename:=r.FormValue("filename")
              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)
          }
          func main() {
          server:=http.Server{Addr: ":8090"}
          http.HandleFunc("/",test2)
          http.HandleFunc("/download",downlaod)
          server.ListenAndServe()
          }

          首先,现在D盘中新建文件夹–gofile,再在gofile中存入图片:

          在这里插入图片描述

          点击下载后,效果截图:

          在这里插入图片描述

          当然,这是下载已经存在的,如果下载不存在的文件,那会显示什么呢?

          html代码如下:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                  "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
              <title>文件下载</title>
          </head>
          <body>
          
          <a href="download?filename=abc123.png">下载</a>
          </body>
          </html>

          则会显示open D:/gofile/abc123.png: The system cannot find the file specified.

          在这里插入图片描述

          以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。