亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編輯內存中的 zip 文件

編輯內存中的 zip 文件

Go
尚方寶劍之說 2022-05-05 16:14:34
我正在嘗試在 Go 中編輯內存中的 zip 文件并通過 HTTP 響應返回壓縮文件目標是在 zip 文件示例中的路徑中添加一些文件我在壓縮文件夾中的路線中添加了一個log.txt文件path/to/file所有這些都應該在不保存文件或編輯原始文件的情況下完成。
查看完整描述

2 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

我實現了一個簡單版本的實時流壓縮,可以正確壓縮單個文件。如果你想讓它高效運行,你需要大量的優化。


這僅供參考。如果需要更多信息,則應在壓縮前設置更多有用的 HTTP 頭信息,以便客戶端正確處理響應數據。


package main


import (

    "archive/zip"

    "io"

    "net/http"

    "os"


    "github.com/gin-gonic/gin"

)


func main() {

    engine := gin.Default()

    engine.GET("/log.zip", func(c *gin.Context) {

        f, err := os.Open("./log.txt")

        if err != nil {

            c.String(http.StatusInternalServerError, err.Error())

            return

        }


        defer f.Close()

        info, err := f.Stat()

        if err != nil {

            c.String(http.StatusInternalServerError, err.Error())

            return

        }


        z := zip.NewWriter(c.Writer)

        head, err := zip.FileInfoHeader(info)

        if err != nil {

            c.String(http.StatusInternalServerError, err.Error())

            return

        }


        defer z.Close()


        w, err := z.CreateHeader(head)

        if err != nil {

            c.String(http.StatusInternalServerError, err.Error())

            return

        }


        _, err = io.Copy(w, f)

        if err != nil {

            c.String(http.StatusInternalServerError, err.Error())

            return

        }

    })


    engine.Run("127.0.0.1:8080")

}


查看完整回答
反對 回復 2022-05-05
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

因此,經過數小時的不懈努力,我發現我的方法很糟糕,或者以我的知識水平可能不可能,所以這里不是一個最佳解決方案,但它可以工作并且填充你的文件不是很大,對你來說應該沒問題。


所以你有一個文件 template.zip 并且你想添加額外的文件,我最初的方法是將整個文件復制到內存中并從他們那里編輯它,但我遇到了麻煩。


我的下一個方法是在內存中逐個文件地重新創建文件,為此我需要知道目錄中的每個文件我使用下面的代碼將所有文件放入列表中


        root := "template"

err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {

    if info.IsDir() {

        return nil

    }append(files,path)}

現在我有了所有文件,我可以創建一個緩沖區來保存所有這些文件


buf := new(bytes.Buffer)


// Create a new zip archive.

zipWriter := zip.NewWriter(buf)

現在有了 zip 存檔,我可以將所有舊文件寫入其中,同時復制內容


for _, file := range files {

    zipFile, err := zipWriter.Create(file)

    if err != nil {

        fmt.Println(err)

    }


    content, err := ioutil.ReadFile(file)

    if err != nil {

        log.Fatal(err)

    }


    // Convert []byte to string and print to screen

    // text := string(content)


    _, err = zipFile.Write(content)

    if err != nil {

        fmt.Println(err)

    }

}

此時,我們的文件在buf.bytes()


剩余的冷添加新文件并將響應發送回客戶端


for _, appCode := range appPageCodeText {

    f, err := zipWriter.Create(filepath.fileextension)


    if err != nil {

        log.Fatal(err)

    }


    _, err = f.Write([]byte(appCode.Content)) 

}


err = zipWriter.Close()

if err != nil {

    fmt.Println(err)

}


w.Header().Set("Content-Disposition", "attachment; filename="+"template.zip")

w.Header().Set("Content-Type", "application/zip")


w.Write(buf.Bytes()) //'Copy' the file to the client


查看完整回答
反對 回復 2022-05-05
  • 2 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號