Golang如何將上傳的文件壓縮成zip(小案例)
Golang將上傳的文件壓縮成zip小案例
這是一個(gè)簡(jiǎn)單的golang壓縮文件小案例,可做很多的拓展,這里使用的庫(kù)是archive/zip,在gopkg里面搜zip就行。
使用gin框架,獲取前端傳過(guò)來(lái)的文件壓縮成zip,存儲(chǔ)路徑入數(shù)據(jù)庫(kù)中,代碼簡(jiǎn)單示例如下:
@Param file formData file true "上傳文件"
func UploadToZip(c *gin.Context){
//獲取前端傳過(guò)來(lái)的文件,如果有多個(gè)文件: 使用form,_ := c.MultipartForm()
//files := form.File["file"]
//然后遍歷files拿到每個(gè)文件
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("存儲(chǔ)文件失敗",c)
return
}
//在指定的目錄生成你要的zip文件
create, err := os.Create("flies/dome.zip")
defer create.Close()
if err != nil {
response.Fail("創(chuàng)建失敗",c)
retuen
}
//創(chuàng)建一個(gè)zip流
writer := zip.NewWriter(create)
defer writer.Close()
//讀取存儲(chǔ)的目錄,將里面的文件壓縮
readFile ,err := os.ReadDir("files")
if err != nil {
response.Fail("讀取文件失敗",c)
retuen
}
//遍歷目錄,獲取單個(gè)文件
for _,rf := range readFile {
//只壓縮文件,目錄不做壓縮
if !rf.IsDir() {
//打開(kāi)要壓縮的文件
open,err := os.Open("flies" + rf.Name())
if err != nil {
response.Fail("打開(kāi)文件失敗",c)
retuen
}
//創(chuàng)建一個(gè)壓縮包里面的文件和文件名,這樣解壓后會(huì)有一個(gè)files目錄,目錄里面有壓縮的文件
f, _ := writer.Create("flies" + rf.Name())
//將文件壓縮成zip
if _,err := io.Copy(f,open);err != nil {
response.Fail("壓縮失敗",c)
retuen
}
}
}
//將壓縮路徑存放數(shù)據(jù)庫(kù)
...
response.OK("壓縮成功",c)
}go語(yǔ)言實(shí)現(xiàn)zip壓縮文件
直接上代碼:
func ZipFiles(filename string, files []string, oldform, newform string) error {
newZipFile, err := os.Create(filename)
if err != nil {
return err
}
defer newZipFile.Close()
zipWriter := zip.NewWriter(newZipFile)
defer zipWriter.Close()
// 把files添加到zip中
for _, file := range files {
zipfile, err := os.Open(file)
if err != nil {
return err
}
defer zipfile.Close()
info, err := zipfile.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = strings.Replace(file, oldform, newform, -1)
header.Method = zip.Deflate
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
if _, err = io.Copy(writer, zipfile); err != nil {
return err
}
}
return nil
}
調(diào)用:
ZipFiles(zipFileName, files, ".", ".")注意:.表示的是根目錄。需要放入壓縮文件的幾個(gè)文件在哪個(gè)目錄,那么該函數(shù)的第3個(gè)參數(shù)就寫(xiě)什么,上面代碼表示待壓縮的文件在根目錄,壓縮文件(第4個(gè)參數(shù))也將生成在根目錄。
到此這篇關(guān)于Golang如何將上傳的文件壓縮成zip(小案例)的文章就介紹到這了,更多相關(guān)go上傳文件壓縮zip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你利用Golang可選參數(shù)實(shí)現(xiàn)可選模式
本文討論Golang函數(shù)可選參數(shù)及函數(shù)類(lèi)型,以及如何利用可選函數(shù)類(lèi)型實(shí)現(xiàn)可選模式。同時(shí)通過(guò)構(gòu)造函數(shù)作為示例,實(shí)現(xiàn)強(qiáng)大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持?jǐn)U展2023-01-01
一文帶你搞懂Golang結(jié)構(gòu)體內(nèi)存布局
結(jié)構(gòu)體在Go語(yǔ)言中是一個(gè)很重要的部分,在項(xiàng)目中會(huì)經(jīng)常用到。這篇文章主要帶大家看一下結(jié)構(gòu)體在內(nèi)存中是怎么分布的?通過(guò)對(duì)內(nèi)存布局的了解,可以幫助我們寫(xiě)出更優(yōu)質(zhì)的代碼。感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-10-10
golang實(shí)現(xiàn)簡(jiǎn)單的tcp數(shù)據(jù)傳輸
這篇文章主要為大家介紹了golang實(shí)現(xiàn)簡(jiǎn)單的tcp數(shù)據(jù)傳輸,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso)
這篇文章主要介紹了golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

