// 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) }