2016-04-22 120 views
0

我正在使用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文件,並且顯示爲空。

如果有人能指出我哪裏出錯或者我誤會了什麼,我將非常感激。我也很樂意提供你想要的任何其他細節。

謝謝!

+0

相關:[在Go AppEngine中正確讀取文件的方式](http://stackoverflow.com/questions/36717098/correct-way-to-read-file-in-go-appengine)。有一些規則可以訪問文件,標記爲靜態的文件/文件夾默認不可用。閱讀鏈接的問題+答案。 – icza

回答

0

使用與包含app.yaml的目錄相關的路徑指定目錄。發佈代碼中的路徑是絕對路徑「/ files」。也許你應該把它改爲「文件」。

記錄從os.Stat和filepath.Walk返回的錯誤。錯誤可能會導致您遇到問題。

+0

謝謝。正如你所說,tarit函數中的路徑需要是相對的。正如@icza所建議的,我還向app.yaml添加了'application_readable:true'。 – smolloy