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

时间:2016-04-22 17:41:12

标签: http google-app-engine go tar

我正在使用Go为Google AppEngine编写应用程序,并且需要将一堆文件聚焦在一起,以便在用户导航到特定URL时为其提供服务。目前文件是静态的,所以我可以通过在上传到服务器之前对它们进行tar来解决这个问题。在将来我想在tarring之前动态改变它们,所以想学习如何tar&根据请求提供静态文件。

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

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

函数tarit是我遇到问题的函数,它目前看起来如下:

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
    })
}

我尝试添加到tarball的文件位于/ files中,我在app.yaml中将此文件夹添加为static_dir。

导航到相应的URL时,浏览器会下载一个大小仅为1 KB的tar文件,并且显示为空。

如果有人能够指出我出错的地方,或者我误解了什么,我将非常感激。我也非常乐意提供您想要的任何其他细节。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

记录从os.Stat和filepath.Walk返回的错误。这些错误可能会引发您的问题。