一名后端程序员现在需要你写代码具体写代码内容如下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-TypeContent-Disposition,以便浏览器正确解析该文件。最后,我们使用 io.Copy 函数将zip文件内容发送给客户端。

需要注意的是,这段示例代码仅作为参考,实际应用中可能需要进行更多的错误处理和安全性检查。

标签: 科技


原文地址: https://gggwd.com/t/topic/7wK 著作权归作者所有。请勿转载和采集!