Chcę obsługiwać plik .ZIP, który jest tworzony w locie, bez konieczności zapisywania go na dysku (operacje we/wy spowolnią wydajność) i dostarczania go do klienta za pośrednictwem protokołu HTTP.Twórz + udostępniaj (przez HTTP) plik .ZIP, bez zapisywania na dysku?
Oto jak ja to pierwsza próba:
func ZipServe(W http.ResponseWriter, R *http.Request) {
buf := new(bytes.Buffer)
writer := zip.NewWriter(buf)
// for the sake of this demonstration, this is the data I will zip
data := ioutil.ReadFile("randomfile.jpg")
f, err := writer.Create("randomfile.jpg")
if err != nil {
fmt.Println(err)
}
_, err = f.Write(data)
if err != nil {
fmt.Println(err)
}
io.Copy(W, buf)
err := writer.Close()
if err != nil {
fmt.Println(err)
}
}
To nie jest dobre, jak kończy się .zip jest uszkodzony po pobraniu. Przypuszczam, że problem związany jest z io.Copy; czy będę używał innej metody?
Kopiujesz program zapisujący zip, zanim go zamkniesz. – JimB
@JimB co jest preferowane ?, do 'io.Copy (w, buf)' lub do 'w.Write (buf.Bytes())' – nbari
@nbari: Ponieważ wiemy, że 'buf' to' bytes.Buffer "więc cały plik jest już w plasterku, wolałbym drugi, ponieważ technicznie nie potrzebujemy wywołania Copy. W praktyce albo jest w porządku. – JimB