Tôi muốn phục vụ tệp .ZIP được tạo khi đang di chuyển mà không phải ghi nó vào đĩa (I/O sẽ làm chậm hiệu năng) và phân phối nó cho khách hàng qua HTTP.Tạo + Phân phối (qua HTTP) tệp .ZIP, mà không cần ghi vào đĩa?
Sau đây là cách tôi lần đầu tiên cố gắng này:
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)
}
}
Đây không phải là tốt, như ZIP kết thúc lên được tham nhũng sau khi tải về. Tôi cho rằng vấn đề có liên quan đến io.Copy; tôi sẽ sử dụng một phương pháp khác?
Bạn đang sao chép trình ghi zip trước khi đóng. – JimB
@JimB cái nào được ưu tiên ?, cho 'io.Copy (w, buf)' hoặc thành 'w.Write (buf.Bytes())' – nbari
@nbari: Vì chúng ta biết rằng 'buf' là một' byte.Buffer Vì vậy, toàn bộ tập tin đã có trong một lát, tôi muốn thứ hai kể từ khi chúng tôi về mặt kỹ thuật không cần các cuộc gọi Copy. Trong thực tế, hoặc là tốt. – JimB