首頁 > 軟體

Go實現檔案上傳和下載

2022-07-26 14:01:26

本文範例為大家分享了Go實現檔案上傳和下載的具體程式碼,供大家參考,具體內容如下

一.檔案上傳

檔案上傳:使用者端把上傳檔案轉換為二進位制流後傳送給伺服器,伺服器對二進位制流進行解析

HTML表單(form)enctype(Encode Type)屬性控制表單在提交資料到伺服器時資料的編碼型別.

  • enctype=”application/x-www-form-urlencoded” 預設值,表單資料會被編碼為名稱/值形式
  • enctype=”multipart/form-data” 編碼成訊息,每個控制元件對應訊息的一部分.請求方式必須是post
  • enctype=”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: 內容MIME型別

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.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com