创建要通过 Google App Engine 提供的 tar 文件

Creating a tar file to be served via Google App Engine

我正在使用 Go 为 Google AppEngine 编写应用程序,需要 tar 将一堆文件放在一起,以便在用户导航到特定 URL 时提供给他们.目前文件是静态的,所以我可以通过 tar 在上传到服务器之前给它们打电话来解决这个问题。将来我想在 tar 响铃之前动态更改它们,因此想学习如何 tar 并根据请求提供静态文件。

在我的 init() 函数中有以下行:

http.HandleFunc("/download.tar", tarit)

函数 tar这是我遇到问题的函数,目前看起来如下所示:

func tarit(w http.ResponseWriter, r *http.Request) {
    tarball := tar.NewWriter(w)
    defer tarball.Close()

    info, err := os.Stat("/files")
    if err != nil {
        return
    }

    var baseDir string
    if info.IsDir() {
        baseDir = filepath.Base("/files")
    }

    filepath.Walk("/files", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        header, err := tar.FileInfoHeader(info, info.Name())
        if err != nil {
            return err
        }

        if baseDir != "" {
            header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, "/files"))
        }

        if err := tarball.WriteHeader(header); err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()
        _, err = io.Copy(tarball, file)
        return err
    })
}

我试图添加到 tar 球的文件位于 /files,我已将此文件夹作为 static_dir 添加到 app.yaml。

当导航到适当的 URL 时,浏览器会下载一个 tar 文件,该文件大小只有 1 KB,而且看起来是空的。

如果有人能指出我哪里错了,或者我误解了什么,我将不胜感激。我也很乐意提供您想要的任何其他详细信息。

谢谢!

使用相对于包含 app.yaml 的目录的路径指定目录。发布代码中的路径是绝对路径“/files”。也许您应该将其更改为 "files".

记录从 os.Stat 和 filepath.Walk 返回的错误。这些错误可能会导致您遇到问题。