Итак, после нескольких часов неутомимой работы я понял, что мой подход был плохим или, возможно, невозможным с уровнем моих знаний, так что это не очень оптимальное решение, но оно работает, и заполняйте файл не так уж и много, это должно быть хорошо для вас .
Итак, у вас есть файл 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