Initial commit: file_manager package with local and S3 support

This commit is contained in:
loveuer
2026-01-17 15:19:50 +08:00
commit f7160ce416
10 changed files with 1526 additions and 0 deletions

View File

@@ -0,0 +1,141 @@
package file_manager
import (
"bytes"
"context"
"os"
"testing"
"time"
)
func TestS3UploadDownload(t *testing.T) {
fm := New(
WithS3(
"http://localhost:9000",
"INsEaUOyLx5PXiqLHv0v",
"xsie9sil2jFtyi0UlnXv7zFafHYk0rWAeROSEYg7",
"test",
"us-east-1",
),
WithS3PathStyle(true),
WithTimeout(10*time.Minute),
WithExpire(24*time.Hour),
)
defer fm.CloseManager()
ctx := context.Background()
content := []byte("hello world from s3")
size := int64(len(content))
reader := bytes.NewReader(content)
result, err := fm.Create(ctx, "test.txt", size, "")
if err != nil {
t.Fatalf("Create failed: %v", err)
}
total, written, err := fm.Upload(ctx, result.Code, 0, size, reader)
if err != nil {
t.Fatalf("Upload failed: %v", err)
}
if total != size {
t.Errorf("expected total %d, got %d", size, total)
}
if written != size {
t.Errorf("expected written %d, got %d", size, written)
}
data, err := fm.Get(ctx, result.Code)
if err != nil {
t.Fatalf("Get failed: %v", err)
}
if !bytes.Equal(data, content) {
t.Errorf("data mismatch, expected %s, got %s", content, data)
}
info, err := fm.GetInfo(ctx, result.Code)
if err != nil {
t.Fatalf("GetInfo failed: %v", err)
}
if info.Filename != "test.txt" {
t.Errorf("expected filename test.txt, got %s", info.Filename)
}
if info.Size != size {
t.Errorf("expected size %d, got %d", size, info.Size)
}
if !info.Complete {
t.Error("expected complete to be true")
}
if info.SHA256 == "" {
t.Error("expected sha256 to be set")
}
err = fm.Delete(ctx, result.Code)
if err != nil {
t.Fatalf("Delete failed: %v", err)
}
_, err = fm.Get(ctx, result.Code)
if err == nil {
t.Error("expected error after delete")
}
}
func TestS3UploadLargeFile(t *testing.T) {
fm := New(
WithS3(
"http://localhost:9000",
"INsEaUOyLx5PXiqLHv0v",
"xsie9sil2jFtyi0UlnXv7zFafHYk0rWAeROSEYg7",
"test",
"us-east-1",
),
WithS3PathStyle(true),
WithTimeout(30*time.Minute),
WithExpire(24*time.Hour),
)
defer fm.CloseManager()
ctx := context.Background()
filePath := "../../x-file/VID_20240215_195046.mp4"
file, err := os.Open(filePath)
if err != nil {
t.Fatalf("open file failed: %v", err)
}
defer file.Close()
stat, err := file.Stat()
if err != nil {
t.Fatalf("stat file failed: %v", err)
}
result, err := fm.Create(ctx, "video.mp4", stat.Size(), "")
if err != nil {
t.Fatalf("Create failed: %v", err)
}
total, written, err := fm.Upload(ctx, result.Code, 0, stat.Size(), file)
if err != nil {
t.Fatalf("Upload failed: %v", err)
}
if total != stat.Size() {
t.Errorf("expected total %d, got %d", stat.Size(), total)
}
if written != stat.Size() {
t.Errorf("expected written %d, got %d", stat.Size(), written)
}
data, err := fm.Get(ctx, result.Code)
if err != nil {
t.Fatalf("Get failed: %v", err)
}
if int64(len(data)) != stat.Size() {
t.Errorf("expected size %d, got %d", stat.Size(), len(data))
}
err = fm.Delete(ctx, result.Code)
if err != nil {
t.Fatalf("Delete failed: %v", err)
}
}