猿问

编辑内存中的 zip 文件

我正在尝试在 Go 中编辑内存中的 zip 文件并通过 HTTP 响应返回压缩文件

目标是在 zip 文件示例中的路径中添加一些文件

我在压缩文件夹中的路线中添加了一个log.txt文件path/to/file

所有这些都应该在不保存文件或编辑原始文件的情况下完成。


尚方宝剑之说
浏览 142回答 2
2回答

呼啦一阵风

我实现了一个简单版本的实时流压缩,可以正确压缩单个文件。如果你想让它高效运行,你需要大量的优化。这仅供参考。如果需要更多信息,则应在压缩前设置更多有用的 HTTP 头信息,以便客户端正确处理响应数据。package mainimport (    "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")}

隔江千里

因此,经过数小时的不懈努力,我发现我的方法很糟糕,或者以我的知识水平可能不可能,所以这里不是一个最佳解决方案,但它可以工作并且填充你的文件不是很大,对你来说应该没问题。所以你有一个文件 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
随时随地看视频慕课网APP

相关分类

Go
我要回答