package app import ( "fmt" "io" "path/filepath" "strings" "github.com/mattermost/focalboard/server/utils" "github.com/mattermost/mattermost-server/v6/shared/mlog" "github.com/mattermost/mattermost-server/v6/shared/filestore" ) func (a *App) SaveFile(reader io.Reader, workspaceID, rootID, filename string) (string, error) { // NOTE: File extension includes the dot fileExtension := strings.ToLower(filepath.Ext(filename)) if fileExtension == ".jpeg" { fileExtension = ".jpg" } createdFilename := fmt.Sprintf(`%s%s`, utils.NewID(utils.IDTypeNone), fileExtension) filePath := filepath.Join(workspaceID, rootID, createdFilename) _, appErr := a.filesBackend.WriteFile(reader, filePath) if appErr != nil { return "", fmt.Errorf("unable to store the file in the files storage: %w", appErr) } return createdFilename, nil } func (a *App) GetFileReader(workspaceID, rootID, filename string) (filestore.ReadCloseSeeker, error) { filePath := filepath.Join(workspaceID, rootID, filename) exists, err := a.filesBackend.FileExists(filePath) if err != nil { return nil, err } // FIXUP: Check the deprecated old location if workspaceID == "0" && !exists { oldExists, err2 := a.filesBackend.FileExists(filename) if err2 != nil { return nil, err2 } if oldExists { err2 := a.filesBackend.MoveFile(filename, filePath) if err2 != nil { a.logger.Error("ERROR moving file", mlog.String("old", filename), mlog.String("new", filePath), mlog.Err(err2), ) } else { a.logger.Debug("Moved file", mlog.String("old", filename), mlog.String("new", filePath), ) } } } reader, err := a.filesBackend.Reader(filePath) if err != nil { return nil, err } return reader, nil }