mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Improve avatar uploading / resizing / compressing, remove Fomantic card module (#24653)
Fixes: #8972 Fixes: #24263 And I think it also (partially) fix #24263 (no need to convert) , because users could upload any supported image format if it isn't larger than AVATAR_MAX_ORIGIN_SIZE The main idea: * if the uploaded file size is not larger than AVATAR_MAX_ORIGIN_SIZE, use the origin * if the resized size is larger than the origin, use the origin Screenshots: JPG: <details>  </details> APNG: <details>   </details> WebP (animated) <details>  </details> The only exception: if a WebP image is larger than MaxOriginSize and it is animated, then current `webp` package can't decode it, so only in this case it isn't supported. IMO no need to support such case: why a user would upload a 1MB animated webp as avatar? crazy ..... --------- Co-authored-by: silverwind <me@silverwind.io>
This commit is contained in:
		@@ -6,7 +6,6 @@ package repository
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"image/png"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
@@ -21,7 +20,7 @@ import (
 | 
			
		||||
// UploadAvatar saves custom avatar for repository.
 | 
			
		||||
// FIXME: split uploads to different subdirs in case we have massive number of repos.
 | 
			
		||||
func UploadAvatar(ctx context.Context, repo *repo_model.Repository, data []byte) error {
 | 
			
		||||
	m, err := avatar.Prepare(data)
 | 
			
		||||
	avatarData, err := avatar.ProcessAvatarImage(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
@@ -47,9 +46,7 @@ func UploadAvatar(ctx context.Context, repo *repo_model.Repository, data []byte)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := storage.SaveFrom(storage.RepoAvatars, repo.CustomAvatarRelativePath(), func(w io.Writer) error {
 | 
			
		||||
		if err := png.Encode(w, *m); err != nil {
 | 
			
		||||
			log.Error("Encode: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		_, err := w.Write(avatarData)
 | 
			
		||||
		return err
 | 
			
		||||
	}); err != nil {
 | 
			
		||||
		return fmt.Errorf("UploadAvatar %s failed: Failed to remove old repo avatar %s: %w", repo.RepoPath(), newAvatar, err)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user