一名后端程序员现在需要你写代码具体写代码内容如下go实现文件打包返回给前端文件路径
以下是一个简单的示例代码,使用Golang实现文件打包,并将文件路径返回给前端:
package main
import (
"archive/zip"
"fmt"
"io"
"log"
"net/http"
"os"
"path/filepath"
)
func main() {
http.HandleFunc("/pack", packHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func packHandler(w http.ResponseWriter, r *http.Request) {
// 获取前端发送的文件路径列表
files := r.FormValue("files")
// 将文件路径列表转换为文件列表
fileList := make([]string, len(files))
for i, file := range files {
fileList[i] = filepath.FromSlash(file)
}
// 创建一个临时zip文件
zipFile, err := os.CreateTemp("", "pack*.zip")
if err != nil {
http.Error(w, "Failed to create zip file", http.StatusInternalServerError)
return
}
defer func() {
zipFile.Close()
os.Remove(zipFile.Name())
}()
// 创建zip文件写入器
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 将文件列表打包到zip文件中
for _, file := range fileList {
if err := addFileToZip(zipWriter, file); err != nil {
http.Error(w, fmt.Sprintf("Failed to add file %s to zip file: %s", file, err), http.StatusInternalServerError)
return
}
}
// 返回zip文件路径
w.Header().Set("Content-Type", "application/zip")
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", zipFile.Name()))
if _, err := io.Copy(w, zipFile); err != nil {
http.Error(w, "Failed to send zip file to client", http.StatusInternalServerError)
return
}
}
func addFileToZip(zipWriter *zip.Writer, filePath string) error {
fileInfo, err := os.Stat(filePath)
if err != nil {
return err
}
header, err := zip.FileInfoHeader(fileInfo)
if err != nil {
return err
}
header.Name = filepath.Base(filePath)
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
if _, err := io.Copy(writer, file); err != nil {
return err
}
return nil
}
这个示例代码中,我们首先创建一个HTTP服务器,并注册一个处理器函数 /pack
,用于处理前端的文件打包请求。
在处理器函数中,我们首先获取前端发送的文件路径列表,并将其转换为文件列表。然后,我们创建一个临时zip文件,并创建一个zip文件写入器。接着,我们将文件列表中的每个文件添加到zip文件中,最后将zip文件路径返回给前端。
在将文件添加到zip文件中的过程中,我们需要使用Golang标准库中的 archive/zip
包。我们使用 FileInfoHeader
函数获取文件信息,并将其转换为zip文件头。然后,我们使用 CreateHeader
函数创建一个zip文件写入器,并将文件内容写入其中。
在返回zip文件路径给前端时,我们设置了HTTP响应头 Content-Type
和 Content-Disposition
,以便浏览器正确解析该文件。最后,我们使用 io.Copy
函数将zip文件内容发送给客户端。
需要注意的是,这段示例代码仅作为参考,实际应用中可能需要进行更多的错误处理和安全性检查。
原文地址: https://gggwd.com/t/topic/7wK 著作权归作者所有。请勿转载和采集!