Refactor: use universal FileHeader when handling file upload, remove usage of global ctx with FileHeader, SavePath, DisableOverwrite

This commit is contained in:
HFO4
2022-02-27 14:03:07 +08:00
parent 8a222e7df4
commit 868a88e5fc
39 changed files with 331 additions and 359 deletions

View File

@@ -39,8 +39,6 @@ const (
CancelFuncCtx
// ValidateCapacityOnceCtx 限定归还容量的操作只執行一次
ValidateCapacityOnceCtx
// 禁止上传时同名覆盖操作
DisableOverwrite
// 文件在从机节点中的路径
SlaveSrcPath
)

View File

@@ -0,0 +1,87 @@
package fsctx
import (
"io"
"time"
)
type WriteMode int
const (
Overwrite WriteMode = iota
Append
Create
)
// FileStream 用户传来的文件
type FileStream struct {
Mode WriteMode
Hidden bool
LastModified time.Time
Metadata map[string]string
File io.ReadCloser
Size uint64
VirtualPath string
Name string
MIMEType string
SavePath string
}
func (file *FileStream) Read(p []byte) (n int, err error) {
return file.File.Read(p)
}
func (file *FileStream) GetMIMEType() string {
return file.MIMEType
}
func (file *FileStream) GetSize() uint64 {
return file.Size
}
func (file *FileStream) Close() error {
return file.File.Close()
}
func (file *FileStream) GetFileName() string {
return file.Name
}
func (file *FileStream) GetVirtualPath() string {
return file.VirtualPath
}
func (file *FileStream) GetMode() WriteMode {
return file.Mode
}
func (file *FileStream) GetMetadata() map[string]string {
return file.Metadata
}
func (file *FileStream) GetLastModified() time.Time {
return file.LastModified
}
func (file *FileStream) IsHidden() bool {
return file.Hidden
}
func (file *FileStream) GetSavePath() string {
return file.SavePath
}
// FileHeader 上传来的文件数据处理器
type FileHeader interface {
io.Reader
io.Closer
GetSize() uint64
GetMIMEType() string
GetFileName() string
GetVirtualPath() string
GetMode() WriteMode
GetMetadata() map[string]string
GetLastModified() time.Time
IsHidden() bool
GetSavePath() string
}

View File

@@ -0,0 +1,48 @@
package fsctx
import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"strings"
"testing"
)
func TestFileStream_GetFileName(t *testing.T) {
asserts := assert.New(t)
file := FileStream{Name: "123"}
asserts.Equal("123", file.GetFileName())
}
func TestFileStream_GetMIMEType(t *testing.T) {
asserts := assert.New(t)
file := FileStream{MIMEType: "123"}
asserts.Equal("123", file.GetMIMEType())
}
func TestFileStream_GetSize(t *testing.T) {
asserts := assert.New(t)
file := FileStream{Size: 123}
asserts.Equal(uint64(123), file.GetSize())
}
func TestFileStream_Read(t *testing.T) {
asserts := assert.New(t)
file := FileStream{
File: ioutil.NopCloser(strings.NewReader("123")),
}
var p = make([]byte, 3)
{
n, err := file.Read(p)
asserts.Equal(3, n)
asserts.NoError(err)
}
}
func TestFileStream_Close(t *testing.T) {
asserts := assert.New(t)
file := FileStream{
File: ioutil.NopCloser(strings.NewReader("123")),
}
err := file.Close()
asserts.NoError(err)
}