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")
}

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
- 2 回答
- 0 關注
- 159 瀏覽
添加回答
舉報