// Save сохраняет переданный в запросе файл в хранилище. func (fs *FileStore) Save(c *rest.Context) error { fileInfo, err := fs.Store.Create(c.Request.Body) // сохраняем в хранилище if err != nil { return err } // файл успешно сохранен var url = c.Request.URL if !strings.HasSuffix(url.Path, "/") { // добавляем к URL запроса "/" в конце, чтобы корректно обработать // объединение относительного пути url.Path += "/" } // объединяем текущий URL запроса с именем сохраненного файла url, _ = url.Parse(fileInfo.Name) urlStr := url.String() // полный URL для доступа к файлу fileInfo.Name = urlStr c.SetHeader("Location", urlStr) log.WithFields(log.Fields{ "url": urlStr, "mime": fileInfo.Mimetype, "size": fileInfo.Size, }).Debug("file saved") // отдаем ответ с информацией о файле c.SetStatus(http.StatusCreated) return c.Write(fileInfo) }
// URLInfo возвращает информацию об указанном в запросе URL. func URLInfo(c *rest.Context) error { urlStr := c.Param("url") if info := urlinfo.Get(urlStr); info != nil { return c.Write(info) } return c.Error(http.StatusBadRequest, fmt.Sprintf("bad urlinfo request %s", urlStr)) }
// Save сохраняет аватарку пользователя в файле func (a *Avatars) Save(c *rest.Context) error { // получаем имя MX-сервера из пути mxname := c.Param("mx-name") // получаем идентификатор пользователя uid, ok := c.Data(userID).(uint64) if !ok { return c.Error(http.StatusInternalServerError, "bad user ID (JID)") } // создаем катало для сохранения аватарки fldr := filepath.Join(a.Path, mxname) if err := os.MkdirAll(fldr, 0700); err != nil { return c.Error(http.StatusInternalServerError, err.Error()) } // добавляем идентификатор пользователя, как имя файла id := strconv.FormatUint(uid, 10) avatar := filepath.Join(fldr, id) // создаем файл file, err := os.Create(avatar) if err != nil { return c.Error(http.StatusInternalServerError, err.Error()) } // копируем в файл содержимое запроса _, err = io.Copy(file, c.Request.Body) file.Close() if err != nil { return c.Error(http.StatusInternalServerError, err.Error()) } // сохраняем дату файла в списке fi, err := os.Stat(avatar) if err != nil { return c.Error(http.StatusInternalServerError, err.Error()) } a.mu.Lock() mxlist := a.list[mxname] if mxlist == nil { mxlist = make(map[uint64]time.Time) } mxlist[uid] = fi.ModTime() a.list[mxname] = mxlist a.mu.Unlock() // отдаем в заголовке путь к созданному файлу c.SetHeader("Location", path.Join(c.Request.URL.Path, id)) c.SetStatus(http.StatusCreated) return c.Write(nil) }
// AvatarGenerator возвращает сгенерированную аватарку пользователя func AvatarGenerator(c *rest.Context) error { c.SetContentType("image/png") return c.Write(icon.Render([]byte(c.Param("id")))) }
// List возвращает список сохраненных аватарок func (a *Avatars) List(c *rest.Context) error { a.mu.RLock() defer a.mu.RUnlock() return c.Write(a.list[c.Param("mx-name")]) }