package file_store import ( "github.com/pkg/errors" "io" "os" "path/filepath" ) type LocalFile struct { StoragePath string } // TODO 实现本来存储文件 // Setup 装载 endpoint sss func (e *LocalFile) Setup(storagePath, _, _, _ string, _ ...ClientOption) error { absolutePath, err := filepath.Abs(storagePath) if err != nil { return errors.New("获取本地文件的绝对路径失败") } e.StoragePath = absolutePath return nil } // UpLoad 上传文件 func (e *LocalFile) UpLoad(yourObjectName string, localFile interface{}) error { var reader io.Reader targetPath := filepath.Join(e.StoragePath, yourObjectName) switch v := localFile.(type) { case string: // 如果是文件路径 localFilePath := v absolutePath, err := filepath.Abs(localFilePath) if err != nil { return errors.Wrap(err, "获取本地文件的绝对路径失败") } file, err := os.Open(absolutePath) if err != nil { return errors.Wrap(err, "打开本地文件失败") } defer func(file *os.File) { _ = file.Close() }(file) reader = file case *os.File: // 如果是文件对象 if v == nil || v.Name() == "" { return errors.New("无效的文件对象") } reader = v default: return errors.New("不支持的参数类型,必须为文件路径字符串或*os.File类型") } // 验证并创建目标路径 if err := validateAndCreatePath(targetPath); err != nil { return errors.Wrap(err, "验证和创建目标路径失败") } // 创建目标文件并准备写入 target, err := os.Create(targetPath) if err != nil { return errors.Wrap(err, "创建目标文件失败") } defer func(target *os.File) { _ = target.Close() }(target) // 复制文件内容到目标位置 if _, err = io.Copy(target, reader); err != nil { return errors.Wrap(err, "复制文件内容到目标位置失败") } return nil } // 验证和创建目标路径 func validateAndCreatePath(path string) error { dir := filepath.Dir(path) if err := os.MkdirAll(dir, 0755); err != nil && !os.IsExist(err) { return errors.Wrap(err, "创建目标文件所在父级目录失败") } return nil } // GetTempToken 获取临时Token func (e *LocalFile) GetTempToken() (string, error) { return "", nil }