checksum opti
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user