最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go-RESTful實(shí)現(xiàn)下載功能思路詳解

 更新時(shí)間:2022年10月11日 10:15:25   作者:伯納烏純白  
這篇文章主要介紹了Go-RESTful實(shí)現(xiàn)下載功能,文件下載包括文件系統(tǒng)IO和網(wǎng)絡(luò)IO,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Go-RESTful實(shí)現(xiàn)下載功能

下載實(shí)現(xiàn)思路

下圖為實(shí)現(xiàn)一個(gè)文件下載所需要考慮的因素:

文件系統(tǒng)IO:

● 文件流的讀寫,其中又包括分文件類型讀寫、文件直接拷貝、借助緩沖區(qū)進(jìn)行IO操作。一般采用直接對(duì)二進(jìn)制文件進(jìn)行讀寫,也有特殊情況如zip壓縮包

網(wǎng)絡(luò)IO:

● 文件傳輸?shù)木W(wǎng)絡(luò)協(xié)議,是通過(guò)http還是tcp進(jìn)行傳輸?一般是通過(guò)http層面進(jìn)行讀寫,
● 網(wǎng)絡(luò)IO中文件主體放在header還是body中?文件直接通過(guò)操作系統(tǒng)IO還是通過(guò)網(wǎng)絡(luò)IO形成附件供下載
● 網(wǎng)絡(luò)傳輸?shù)腃ontent-Type,是否符合框架的標(biāo)準(zhǔn)?appclication/octet-stream和其他如applicaiton/zip的區(qū)別
下載的實(shí)現(xiàn)流程

服務(wù)建立

業(yè)務(wù)背景是需要啟動(dòng)一個(gè)服務(wù),使得用戶可以通過(guò)訪問這個(gè)服務(wù)對(duì)某一資源的接口地址進(jìn)行訪問后下載,因此需要先建立Web Service

ws := new(restful.WebService)
	ws.Path("/download").Consumes(restful.MIME_JSON,restful.MIME_OCTET).
		Produces(restful.MIME_JSON, restful.MIME_OCTET)

這里需要注意的是,Consumers和Produces中務(wù)必指定MIME類型,否則會(huì)按JSON或者XML處理(具體邏輯可以查看相關(guān)源碼)。支持的MIME類型如下:

MIME_XML   = "application/xml"          // Accept or Content-Type used in Consumes() and/or Produces()
	MIME_JSON  = "application/json"         // Accept or Content-Type used in Consumes() and/or Produces()
	MIME_OCTET = "application/octet-stream" // If Content-Type is not present in request, use the default

配置路由

建立一個(gè)路由如下,同時(shí)引入函數(shù)的handler:

ws.Route(ws.GET("/img").To(download.DownLoadRequest).Doc("Add user").
		Returns(http.StatusOK, "下載成功", ""))
	//注冊(cè)webservice
	restful.Add(ws)
	log.Fatal(http.ListenAndServe(":8080", nil)) // 啟動(dòng)監(jiān)聽

這里需要注意的有幾點(diǎn):

  • restful是接口風(fēng)格,并不是直接的http方法,因此restful.request并不和http.request等價(jià)。要接收http.request的數(shù)據(jù)應(yīng)當(dāng)是對(duì)restful.request的Writer進(jìn)行操作。
  • 一定要引入Content-Disposition,這樣才會(huì)使得Get到的二進(jìn)制文件直接以附件的形式加載出來(lái)
  • Content-Type一定要是restful支持的MIME類型
func DownLoadRequest(request *restful.Request, response *restful.Response) {
	// 建立客戶端去Get請(qǐng)求一個(gè)資源,此處以一張圖片為例子
	client := http.Client{}
	defer client.CloseIdleConnections()
	res, err := client.Get("https://img-home.csdnimg.cn/images/20201124032511.png")
	if err != nil {
		response.WriteError(http.StatusInternalServerError, errors.New("下載失敗"))
	}
	//此處是關(guān)鍵
	response.ResponseWriter.Header().Set(restful.HEADER_ContentType, restful.MIME_OCTET)
	response.ResponseWriter.Header().Set("Content-Disposition", "attachment;filename=20201124032511.png")
	// 將客戶端請(qǐng)求的結(jié)果序列化出來(lái)
	// 不要忘了關(guān)閉Body
	defer res.Body.Close()
	b, err := ioutil.ReadAll(res.Body)
	if err != nil {
		response.WriteError(http.StatusInternalServerError, errors.New("下載失敗"))
	}
	_, err = response.ResponseWriter.Write(b)
	if err != nil {
		response.WriteError(http.StatusInternalServerError, errors.New("文件讀取失敗"))
	}
}

用Postman請(qǐng)求一下這個(gè)服務(wù):

直接將二進(jìn)制內(nèi)容作返回了。此時(shí)不要選擇Send,選擇Send and Download:

就會(huì)有提示下載附件

總結(jié)

文件下載的實(shí)現(xiàn)實(shí)質(zhì)就是文件流的接收和拷貝,當(dāng)涉及到不同的文件格式時(shí)需要考慮到不同的header和content-type。此外restful中的響應(yīng)和http的不等價(jià),需要借助writer。

到此這篇關(guān)于Go-RESTful實(shí)現(xiàn)下載功能的文章就介紹到這了,更多相關(guān)Go RESTful下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go panic和recover函數(shù)使用細(xì)節(jié)深入探究

    Go panic和recover函數(shù)使用細(xì)節(jié)深入探究

    這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細(xì)節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語(yǔ)言使用釘釘機(jī)器人推送消息的實(shí)現(xiàn)示例

    Go語(yǔ)言使用釘釘機(jī)器人推送消息的實(shí)現(xiàn)示例

    本文主要介紹了Go語(yǔ)言使用釘釘機(jī)器人推送消息的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Go語(yǔ)言遍歷目錄的三種方法舉例

    Go語(yǔ)言遍歷目錄的三種方法舉例

    學(xué)習(xí)io之后,尤其是文件操作,我們就可以遍歷給定的目錄了,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言遍歷目錄的三種方法,分別是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以參考下
    2023-11-11
  • 線上golang grpc服務(wù)資源泄露問題排查

    線上golang grpc服務(wù)資源泄露問題排查

    這篇文章主要介紹了線上golang grpc服務(wù)資源泄露問題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • GoLang函數(shù)與面向接口編程全面分析講解

    GoLang函數(shù)與面向接口編程全面分析講解

    這篇文章主要介紹了GoLang函數(shù)與面向接口編程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機(jī)會(huì),在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來(lái)描述依賴的,可讀性非常好,而且與強(qiáng)大的?shell?結(jié)合在一起,基本可以實(shí)現(xiàn)任何想要的功能
    2023-01-01
  • Go項(xiàng)目與Docker結(jié)合實(shí)現(xiàn)高效部署深入探究

    Go項(xiàng)目與Docker結(jié)合實(shí)現(xiàn)高效部署深入探究

    在現(xiàn)代軟件開發(fā)中,使用Docker部署應(yīng)用程序已經(jīng)成為一種標(biāo)準(zhǔn)實(shí)踐,本文將深入探討如何將Go項(xiàng)目與Docker結(jié)合,實(shí)現(xiàn)高效、可靠的部署過(guò)程,通過(guò)詳細(xì)的步驟和豐富的示例,你將能夠迅速掌握這一流程
    2023-12-12
  • Golang操作excel的方法

    Golang操作excel的方法

    這篇文章主要介紹了Golang操作excel的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用Go語(yǔ)言開發(fā)自動(dòng)化API測(cè)試工具詳解

    使用Go語(yǔ)言開發(fā)自動(dòng)化API測(cè)試工具詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言開發(fā)自動(dòng)化API測(cè)試工具,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-03-03
  • 使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能(demo)

    使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能(demo)

    這篇文章主要介紹了使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

永顺县| 同仁县| 沭阳县| 德江县| 西林县| 崇左市| 五寨县| 岳阳市| 梅河口市| 建德市| 临清市| 余干县| 安平县| 商城县| 蓬安县| 日土县| 留坝县| 平泉县| 大安市| 库尔勒市| 长顺县| 全州县| 普安县| 武平县| 合水县| 始兴县| 册亨县| 星子县| 德清县| 大城县| 准格尔旗| 保德县| 高台县| 永顺县| 怀集县| 广汉市| 孟州市| 平乡县| 昌黎县| 郎溪县| 仁怀市|