使用Golang生成壓縮文件的詳細(xì)教程
這是一個簡單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫是archive/zip,在gopkg里面搜zip就行。
方法一
使用gin框架,獲取前端傳過來的文件壓縮成zip,存儲路徑入數(shù)據(jù)庫中,代碼簡單示例如下:
@Param file formData file true "上傳文件" func UploadToZip(c *gin.Context){ //獲取前端傳過來的文件,如果有多個文件: 使用form,_ := c.MultipartForm() //files := form.File["file"] //然后遍歷files拿到每個文件 file,err := c.FormFile("file") if err != nil { response.Fail("參數(shù)有誤",c) return } //創(chuàng)建目錄和指定文件名 err = c.SaveUploadedFile( file ,"files/" + file + file.Filename) if err != nil { response.Fail("存儲文件失敗",c) return } //在指定的目錄生成你要的zip文件 create, err := os.Create("flies/dome.zip") defer create.Close() if err != nil { response.Fail("創(chuàng)建失敗",c) retuen } //創(chuàng)建一個zip流 writer := zip.NewWriter(create) defer writer.Close() //讀取存儲的目錄,將里面的文件壓縮 readFile ,err := os.ReadDir("files") if err != nil { response.Fail("讀取文件失敗",c) retuen } //遍歷目錄,獲取單個文件 for _,rf := range readFile { //只壓縮文件,目錄不做壓縮 if !rf.IsDir() { //打開要壓縮的文件 open,err := os.Open("flies" + rf.Name()) if err != nil { response.Fail("打開文件失敗",c) retuen } //創(chuàng)建一個壓縮包里面的文件和文件名,這樣解壓后會有一個files目錄,目錄里面有壓縮的文件 f, _ := writer.Create("flies" + rf.Name()) //將文件壓縮成zip if _,err := io.Copy(f,open);err != nil { response.Fail("壓縮失敗",c) retuen } } } //將壓縮路徑存放數(shù)據(jù)庫 ... response.OK("壓縮成功",c) }
方法二
壓縮實(shí)現(xiàn)過程
創(chuàng)建壓縮歸檔文件
首先需要創(chuàng)建歸檔文件,與其他普通文件一樣。使用os
包的os.Create
函數(shù):
func Create(name string) (*File, error)
該方法創(chuàng)建或刪除給定名稱文件。如果文件已存在則刪除重新創(chuàng)建,如果不存在,創(chuàng)建文件,模式為0666。創(chuàng)建成功返回File用于讀寫,關(guān)聯(lián)文件描述符為O_RDWR
,反之報錯,類型為*PathError
。
初始化歸檔文件zip.Writer
使用 archive/zip 包 中的zip.NewWriter
函數(shù),用于寫數(shù)據(jù)(文件或目錄)至最終的壓縮文件。
語法如下:
func NewWriter(w io.Writer) *Writer
NewWriter 返回Writer寫
使用zip.Writer.Create增加文件壓縮文件
上面已創(chuàng)建了zip.Writer,可以增加文件和目錄至壓縮文件,使用zip.Writer.Create函數(shù):
func (w *Writer) Create(name string) (io.Writer, error)
方法通過文件名稱增加文件至壓縮文件,返回Writer用于寫文件內(nèi)容,文件內(nèi)容將被壓縮。文件名稱必須為相對路徑,不能以驅(qū)動器字母(C:)或斜杠開頭,僅允許正斜杠。如果增加目錄,需要在名稱后面增加尾斜杠。在下一次調(diào)用Create, CreateHeader, 或 Close方法之前,文件內(nèi)容必須被寫入io.Writer.
使用 io.Copy 或 io.Writer.Write 寫文件內(nèi)容
zip.Writer.Create返回io.Writer,用于寫數(shù)據(jù),所以任何文件內(nèi)容可以流入或?qū)懭朐揥riter,也可以使用io.Copy函數(shù)。
func Copy(dst Writer, src Reader) (written int64, err error)
Copy函數(shù)從src至dst,直達(dá)EOF或遇到錯誤。返回拷貝的字節(jié)數(shù)以及錯誤(如果有錯誤發(fā)生)。
使用zip.Writer.Close關(guān)閉壓縮文件
所有文件和目錄寫入至壓縮文件后,需要通過zip.Writer.Close方法關(guān)閉寫生成壓縮文件,即寫所有數(shù)據(jù)至底層數(shù)據(jù)流。
func (w *Writer) Close() error
實(shí)例代碼
下面示例壓縮兩個文件(txt和csv文件)生成單個壓縮文件。這兩個文件分別在壓縮文件的不同子目錄中。
package main import ( "archive/zip" "fmt" "io" "os" ) func main() { fmt.Println("creating zip archive...") archive, err := os.Create("archive.zip") if err != nil { panic(err) } defer archive.Close() zipWriter := zip.NewWriter(archive) fmt.Println("opening first file...") f1, err := os.Open("test.csv") if err != nil { panic(err) } defer f1.Close() fmt.Println("writing first file to archive...") w1, err := zipWriter.Create("csv/test.csv") if err != nil { panic(err) } if _, err := io.Copy(w1, f1); err != nil { panic(err) } fmt.Println("opening second file") f2, err := os.Open("test.txt") if err != nil { panic(err) } defer f2.Close() fmt.Println("writing second file to archive...") w2, err := zipWriter.Create("txt/test.txt") if err != nil { panic(err) } if _, err := io.Copy(w2, f2); err != nil { panic(err) } fmt.Println("closing zip archive...") zipWriter.Close() }
運(yùn)行程序,生成日志:
creating zip archive... opening first file... writing first file to archive... opening second file writing second file to archive... closing zip archive...
最后解壓壓縮文件,和我們期望的一致:
$ unzip -l archive.zip Archive: archive.zip Length Date Time Name --------- ---------- ----- ---- 50 1980-00-00 00:00 csv/test.csv 16 1980-00-00 00:00 txt/test.txt --------- ------- 66 2 files
總結(jié)
以上就是使用Golang生成壓縮文件的詳細(xì)教程的詳細(xì)內(nèi)容,更多關(guān)于Golang生成壓縮文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang的循環(huán)語句和循環(huán)控制語句詳解
循環(huán)語句為了簡化程序中有規(guī)律的重復(fù)性操作,需要用到循環(huán)語句,和其他大多數(shù)編程語言一樣,GO的循環(huán)語句有for循環(huán),不同的是沒有while循環(huán),而循環(huán)控制語句可以改變循環(huán)語句的執(zhí)行過程,下面給大家介紹下go循環(huán)語句和循環(huán)控制語句的相關(guān)知識,一起看看吧2021-11-11Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼
這篇文章主要介紹了Go Gin實(shí)現(xiàn)文件上傳下載的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04go語言 swagger 查詢 json 字段注釋的示例代碼
在Go語言中,使用Swagger通過swag工具和gin-gonic框架生成API文檔,涉及引入依賴、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢參數(shù)的API端點(diǎn)添加注釋,感興趣的朋友跟隨小編一起看看吧2024-09-09Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫
這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運(yùn)行加載C動態(tài)庫,Golang?程序在運(yùn)行時加載C動態(tài)庫的技術(shù),跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性2022-07-07MacOS下本地golang環(huán)境搭建詳細(xì)教程
這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09go語言 xorm框架 postgresql 的用法及詳細(xì)注解
這篇文章主要介紹了go語言 xorm框架 postgresql 的用法及詳細(xì)注解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12