我正在使用Go爲Google AppEngine編寫一個應用程序,並且需要將一堆文件放到一起以在用戶導航到特定URL時提供給用戶。目前這些文件是靜態的,所以我可以通過在上傳到服務器之前將它們tar化來解決這個問題。在未來,我想動態改變它們之前tar的,所以想學習如何根據請求服務於靜態文件。創建一個通過Google App Engine提供的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
})
}
我試圖添加到壓縮包中的文件位於/文件中,並且我在app.yaml中將此文件夾添加爲static_dir。
當瀏覽到適當的URL時,瀏覽器下載一個只有1 KB大小的tar文件,並且顯示爲空。
如果有人能指出我哪裏出錯或者我誤會了什麼,我將非常感激。我也很樂意提供你想要的任何其他細節。
謝謝!
相關:[在Go AppEngine中正確讀取文件的方式](http://stackoverflow.com/questions/36717098/correct-way-to-read-file-in-go-appengine)。有一些規則可以訪問文件,標記爲靜態的文件/文件夾默認不可用。閱讀鏈接的問題+答案。 – icza