使用Golang生成壓縮文件的詳細教程
這是一個簡單的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)
}
方法二
壓縮實現(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,直達EOF或遇到錯誤。返回拷貝的字節(jié)數(shù)以及錯誤(如果有錯誤發(fā)生)。
使用zip.Writer.Close關(guān)閉壓縮文件
所有文件和目錄寫入至壓縮文件后,需要通過zip.Writer.Close方法關(guān)閉寫生成壓縮文件,即寫所有數(shù)據(jù)至底層數(shù)據(jù)流。
func (w *Writer) Close() error
實例代碼
下面示例壓縮兩個文件(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()
}
運行程序,生成日志:
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生成壓縮文件的詳細教程的詳細內(nèi)容,更多關(guān)于Golang生成壓縮文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang的循環(huán)語句和循環(huán)控制語句詳解
循環(huán)語句為了簡化程序中有規(guī)律的重復性操作,需要用到循環(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-11
go語言 swagger 查詢 json 字段注釋的示例代碼
在Go語言中,使用Swagger通過swag工具和gin-gonic框架生成API文檔,涉及引入依賴、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢參數(shù)的API端點添加注釋,感興趣的朋友跟隨小編一起看看吧2024-09-09
Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫
這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫,Golang?程序在運行時加載C動態(tài)庫的技術(shù),跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性2022-07-07
go語言 xorm框架 postgresql 的用法及詳細注解
這篇文章主要介紹了go語言 xorm框架 postgresql 的用法及詳細注解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

