2016-04-22 3 views
0

Я пишу приложение для Google AppEngine с помощью Go, и вам нужно собрать вместе множество файлов, которые будут использоваться для пользователя, когда они будут перемещаться по определенному URL-адресу. На данный момент файлы являются статическими, поэтому я могу решить эту проблему, выполнив их до загрузки на сервер. В будущем я хотел бы динамически изменить их до tarring, и поэтому хотел бы узнать, как tar & обслуживать статические файлы по запросу.Создание файла tar для обслуживания через Google App Engine

В моей функции инициализации() У меня есть следующие строки:

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, и я добавил эту папку как static_dir в app.yaml.

При переходе по соответствующему URL браузер загружает tar-файл размером всего в 1 КБ и выглядит пустым.

Я был бы очень признателен, если бы кто-нибудь мог указать, где я ошибаюсь, или то, что я недопонимаю. Я также был бы очень рад предоставить любые другие детали, которые вы хотели бы.

Спасибо!

+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 должны быть относительными. Я также добавил 'application_readable: true' в app.yaml, как было предложено @icza. – smolloy

Смежные вопросы