mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 00:02:59 -04:00 
			
		
		
		
	When creating attachments (issue, release, repo) the file size (being part of the multipart file header) is passed through the chain of creating an attachment to ensure the MinIO client can stream the file directly instead of having to read it to memory completely at first. Fixes #23393 Co-authored-by: KN4CK3R <admin@oldschoolhack.me> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2021 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package attachment
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 
 | |
| 	"code.gitea.io/gitea/models/db"
 | |
| 	repo_model "code.gitea.io/gitea/models/repo"
 | |
| 	"code.gitea.io/gitea/modules/storage"
 | |
| 	"code.gitea.io/gitea/modules/upload"
 | |
| 	"code.gitea.io/gitea/modules/util"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| )
 | |
| 
 | |
| // NewAttachment creates a new attachment object, but do not verify.
 | |
| func NewAttachment(attach *repo_model.Attachment, file io.Reader, size int64) (*repo_model.Attachment, error) {
 | |
| 	if attach.RepoID == 0 {
 | |
| 		return nil, fmt.Errorf("attachment %s should belong to a repository", attach.Name)
 | |
| 	}
 | |
| 
 | |
| 	err := db.WithTx(db.DefaultContext, func(ctx context.Context) error {
 | |
| 		attach.UUID = uuid.New().String()
 | |
| 		size, err := storage.Attachments.Save(attach.RelativePath(), file, size)
 | |
| 		if err != nil {
 | |
| 			return fmt.Errorf("Create: %w", err)
 | |
| 		}
 | |
| 		attach.Size = size
 | |
| 
 | |
| 		return db.Insert(ctx, attach)
 | |
| 	})
 | |
| 
 | |
| 	return attach, err
 | |
| }
 | |
| 
 | |
| // UploadAttachment upload new attachment into storage and update database
 | |
| func UploadAttachment(file io.Reader, allowedTypes string, fileSize int64, opts *repo_model.Attachment) (*repo_model.Attachment, error) {
 | |
| 	buf := make([]byte, 1024)
 | |
| 	n, _ := util.ReadAtMost(file, buf)
 | |
| 	buf = buf[:n]
 | |
| 
 | |
| 	if err := upload.Verify(buf, opts.Name, allowedTypes); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return NewAttachment(opts, io.MultiReader(bytes.NewReader(buf), file), fileSize)
 | |
| }
 |