Go實(shí)現(xiàn)文件上傳和下載
本文實(shí)例為大家分享了Go實(shí)現(xiàn)文件上傳和下載的具體代碼,供大家參考,具體內(nèi)容如下
一.文件上傳
文件上傳:客戶端把上傳文件轉(zhuǎn)換為二進(jìn)制流后發(fā)送給服務(wù)器,服務(wù)器對(duì)二進(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ù)會(huì)被編碼為名稱/值形式
- enctype=”multipart/form-data” 編碼成消息,每個(gè)控件對(duì)應(yīng)消息的一部分.請(qǐ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() }
操作如下圖:
第一步:輸入文件名
第二步,選擇文件:
第四步:按提交按鈕:
最后,上傳成功:
我們?cè)賮頇z查一下D盤:
上傳成功!
二.文件下載簡介
文件下載總體步驟
- 客戶端向服務(wù)端發(fā)起請(qǐng)求,請(qǐng)求參數(shù)包含要下載文件的名稱
- 服務(wù)器接收到客戶端請(qǐng)求后把文件設(shè)置到響應(yīng)對(duì)象中,響應(yīng)給客戶端瀏覽器
載時(shí)需要設(shè)置的響應(yīng)頭信息
- Content-Type: 內(nèi)容MIME類型
application/octet-stream 任意類型
- Content-Disposition:客戶端對(duì)內(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)存在的,如果下載不存在的文件,那會(huì)顯示什么呢?
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>
則會(huì)顯示open D:/gofile/abc123.png: The system cannot find the file specified.
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
golang?gorm開發(fā)架構(gòu)及寫插件示例
這篇文章主要為大家介紹了golang?gorm開發(fā)架構(gòu)及寫插件的詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?con
這篇文章主要為大家介紹了golang提示dial?tcp?172?.217.163.49:443:?connectex:?A?connection?attempt?failed解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07golang語言如何將interface轉(zhuǎn)為int, string,slice,struct等類型
這篇文章主要介紹了golang語言如何將interface轉(zhuǎn)為int, string,slice,struct等類型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Go語言開發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放
這篇文章主要為大家介紹了Go語言開發(fā)瀏覽器視頻流rtsp轉(zhuǎn)webrtc播放的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka)
消息隊(duì)列是一種異步的服務(wù)間通信方式,適用于無服務(wù)器和微服務(wù)架構(gòu),本文主要介紹了Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka),需要的朋友可以了解一下2024-02-02