Go實(shí)現(xiàn)文件上傳和下載
本文實(shí)例為大家分享了Go實(shí)現(xiàn)文件上傳和下載的具體代碼,供大家參考,具體內(nèi)容如下
一.文件上傳
文件上傳:客戶端把上傳文件轉(zhuǎn)換為二進(jìn)制流后發(fā)送給服務(wù)器,服務(wù)器對二進(jìn)制流進(jìn)行解析
HTML表單(form)enctype(Encode Type)屬性控制表單在提交數(shù)據(jù)到服務(wù)器時(shí)數(shù)據(jù)的編碼類型.
- enctype=”application/x-www-form-urlencoded” 默認(rèn)值,表單數(shù)據(jù)會被編碼為名稱/值形式
- enctype=”multipart/form-data” 編碼成消息,每個(gè)控件對應(yīng)消息的一部分.請求方式必須是post
- enctype=”text/plain” 純文本形式進(jìn)行編碼的
HTML模版內(nèi)容如下(在項(xiàng)目/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>
服務(wù)端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()
}效果截圖:

這比我之前學(xué)的Java Swing簡便多了!
獲取客戶端傳遞后的文件流,把文件保存到服務(wù)器即可,我們以上傳一張照片為例。
我們新增一個(gè)頁面:文件上傳成功,當(dāng)我們上傳成功時(shí)顯示上傳成功。
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>
此時(shí),服務(wù)器端代碼要保存接受的圖片。
服務(wù)器端代碼如下:
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盤:

上傳成功!
二.文件下載簡介
文件下載總體步驟
- 客戶端向服務(wù)端發(fā)起請求,請求參數(shù)包含要下載文件的名稱
- 服務(wù)器接收到客戶端請求后把文件設(shè)置到響應(yīng)對象中,響應(yīng)給客戶端瀏覽器
載時(shí)需要設(shè)置的響應(yīng)頭信息
- Content-Type: 內(nèi)容MIME類型
application/octet-stream 任意類型
- Content-Disposition:客戶端對內(nèi)容的操作方式
inline 默認(rèn)值,表示瀏覽器能解析就解析,不能解析下載
attachment;filename=下載時(shí)顯示的文件名 ,客戶端瀏覽器恒下載
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()
}首先,現(xiàn)在D盤中新建文件夾–gofile,再在gofile中存入圖片:

點(diǎn)擊下載后,效果截圖:

當(dāng)然,這是下載已經(jīng)存在的,如果下載不存在的文件,那會顯示什么呢?
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.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
golang調(diào)用shell命令(實(shí)時(shí)輸出,終止)
本文主要介紹了golang調(diào)用shell命令(實(shí)時(shí)輸出,終止),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Golang中重復(fù)錯(cuò)誤處理的優(yōu)化方法
這篇文章主要給大家介紹了關(guān)于Golang中重復(fù)錯(cuò)誤處理優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Go單體服務(wù)開發(fā)最佳實(shí)踐總結(jié)
這篇文章主要介紹了Go單體服務(wù)開發(fā)最佳實(shí)踐,通過本文詳細(xì)跟大家分享一下如何使用?go-zero?快速開發(fā)一個(gè)有多個(gè)模塊的單體服務(wù),需要的朋友可以參考下2022-04-04
使用Golang實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與分析
在網(wǎng)絡(luò)通信中,網(wǎng)絡(luò)數(shù)據(jù)包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網(wǎng)絡(luò)流量的方法,用于獲取網(wǎng)絡(luò)數(shù)據(jù)包并對其進(jìn)行分析,本文將介紹如何使用Golang實(shí)現(xiàn)抓包功能,包括網(wǎng)絡(luò)數(shù)據(jù)包捕獲和數(shù)據(jù)包分析,需要的朋友可以參考下2023-11-11
golang 調(diào)用c語言動態(tài)庫方式實(shí)現(xiàn)
本文主要介紹了golang 調(diào)用c語言動態(tài)庫方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

