как обслуживать большие zip-файлы изображений Blobstorage?

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

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

Можно ли обслуживать такие zip-файлы, передавая их напрямую клиенту, не сохраняя их в памяти? есть другое решение?

w.Header().Set("Content-Type", "application/zip")
w.Header().Set("Content-Disposition", "attachment;filename=photos.zip")

writer := zip.NewWriter(w)

defer writer.Close()

for _, key := range l.Files {
    info, err := blobstore.Stat(c, appengine.BlobKey(key))

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return  
    }

    wr, err := writer.Create(info.Filename)

    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return  
    }

    reader := blobstore.NewReader(c, appengine.BlobKey(key))

    io.Copy(wr, reader)
}   

person Gal Ben-Haim    schedule 22.04.2013    source источник


Ответы (1)


Вероятно, вам следует создать zip-файл в хранилище blobstore, а затем обслуживать его оттуда:

  • Создайте zip-архив в магазине blobstore с помощью blobstore.Writer
  • Отправьте zip-архив с помощью blobstore.Send

Таким образом, вы также можете ускорить последующие запросы для того же zip / пакета, поскольку вы уже создали / сохранили его.

person Chris Farmiloe    schedule 22.04.2013