В Go для сохранения результатов кодогенерации в архив и последующего его отдачи можно воспользоваться стандартными пакетами archive/zip
и net/http
.
Первым шагом необходимо создать архив и добавить в него нужные файлы. Для этого применяется пакет archive/zip
. Ниже приведен пример кода, демонстрирующий этот процесс:
package main import ( "archive/zip" "fmt" "io" "os" ) func main() { // Создаем новый архив для сохранения результатов zipFile, err := os.Create("results.zip") if err != nil { fmt.Println("Ошибка при создании архива:", err) return } defer zipFile.Close() // Создаем новый архиватор zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close() // Добавляем файлы в архив file1, err := os.Open("file1.txt") if err != nil { fmt.Println("Ошибка при открытии файла:", err) return } defer file1.Close() // Создаем новое имя файла в архиве file1InZip, err := zipWriter.Create("file1.txt") if err != nil { fmt.Println("Ошибка при добавлении файла в архив:", err) return } // Копируем содержимое файла в архив _, err = io.Copy(file1InZip, file1) if err != nil { fmt.Println("Ошибка при копировании файла в архив:", err) return } // Повторяем те же шаги для остальных файлов, если необходимо fmt.Println("Архив успешно создан") }
В этом примере создается новый архив с именем "results.zip" и добавляется файл "file1.txt" в архив с тем же именем. Вы можете повторять аналогичные шаги для добавления других файлов в архив.
После создания архива вы можете использовать пакет net/http
для его отдачи по HTTP. Пример ниже показывает, как отдать архив при обработке запроса:
package main import ( "io" "net/http" "os" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // Открываем архив для чтения zipFile, err := os.Open("results.zip") if err != nil { http.Error(w, "Ошибка при открытии архива", http.StatusInternalServerError) return } defer zipFile.Close() // Отдаем архив как ответ на запрос w.Header().Set("Content-Type", "application/zip") w.Header().Set("Content-Disposition", "attachment; filename=results.zip") _, err = io.Copy(w, zipFile) if err != nil { http.Error(w, "Ошибка при отправке архива", http.StatusInternalServerError) return } }) http.ListenAndServe(":8080", nil) }
В этом примере создается обработчик для корневого пути "/", который открывает архив "results.zip" и отправляет его в качестве ответа на запрос. Заголовки Content-Type
и Content-Disposition
установлены для указания типа контента и файла, который будет скачан.
Вы можете запустить этот код на сервере и обратиться к нему через веб-браузер для загрузки архива "results.zip".