checksum opti

This commit is contained in:
m
2026-07-29 18:50:41 +02:00
parent d73dc9d381
commit 68a4beef37
+15 -29
View File
@@ -2,10 +2,13 @@ package service
import ( import (
"context" "context"
"crypto/sha256"
"database/sql" "database/sql"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
"hash"
"io"
"mime/multipart" "mime/multipart"
"os" "os"
"path/filepath" "path/filepath"
@@ -34,22 +37,12 @@ func (s *ResourceService) Upload(file *multipart.FileHeader, ownerID string) (*m
return nil, fmt.Errorf("create upload dir: %w", err) return nil, fmt.Errorf("create upload dir: %w", err)
} }
if err := saveUploadedFile(file, dst); err != nil { h := sha256.New()
checksum, err := saveUploadedFile(file, dst, h)
if err != nil {
return nil, fmt.Errorf("save file: %w", err) return nil, fmt.Errorf("save file: %w", err)
} }
data, err := os.ReadFile(dst)
if err != nil {
return nil, fmt.Errorf("read saved file: %w", err)
}
info, err := os.Stat(dst)
if err != nil {
return nil, fmt.Errorf("stat file: %w", err)
}
checksum := hex.EncodeToString(CreateSHA256Hash(data))
ownerUUID, err := uuid.Parse(ownerID) ownerUUID, err := uuid.Parse(ownerID)
if err != nil { if err != nil {
return nil, fmt.Errorf("parse owner id: %w", err) return nil, fmt.Errorf("parse owner id: %w", err)
@@ -86,7 +79,7 @@ func (s *ResourceService) Upload(file *multipart.FileHeader, ownerID string) (*m
dbResource, err := qtx.CreateResource(ctx, db.CreateResourceParams{ dbResource, err := qtx.CreateResource(ctx, db.CreateResourceParams{
Name: file.Filename, Name: file.Filename,
MimeType: file.Header.Get("Content-Type"), MimeType: file.Header.Get("Content-Type"),
Size: info.Size(), Size: file.Size,
Checksum: checksum, Checksum: checksum,
OwnerID: ownerUUID, OwnerID: ownerUUID,
}) })
@@ -438,30 +431,23 @@ func dbResourceToModel(r db.Resource, dbTags []db.Tag) model.Resource {
} }
} }
func saveUploadedFile(file *multipart.FileHeader, dst string) error { func saveUploadedFile(file *multipart.FileHeader, dst string, h hash.Hash) (string, error) {
src, err := file.Open() src, err := file.Open()
if err != nil { if err != nil {
return err return "", err
} }
defer src.Close() defer src.Close()
out, err := os.Create(dst) out, err := os.Create(dst)
if err != nil { if err != nil {
return err return "", err
} }
defer out.Close() defer out.Close()
buf := make([]byte, 32*1024) writer := io.MultiWriter(out, h)
for { if _, err := io.CopyN(writer, src, file.Size); err != nil {
n, readErr := src.Read(buf) return "", err
if n > 0 {
if _, writeErr := out.Write(buf[:n]); writeErr != nil {
return writeErr
} }
}
if readErr != nil { return hex.EncodeToString(h.Sum(nil)), nil
break
}
}
return nil
} }