Files
go_aliyun_oss/file.go

123 lines
2.7 KiB
Go
Raw Normal View History

2021-03-13 23:19:41 +08:00
package go_aliyun_oss
2020-11-21 21:51:07 +08:00
import (
2023-02-27 15:25:33 +08:00
"errors"
2020-11-21 21:51:07 +08:00
"fmt"
uuid "github.com/satori/go.uuid"
"io/ioutil"
"mime/multipart"
"os"
"path/filepath"
"reflect"
"strings"
)
type OssFile struct {
2023-02-27 15:25:33 +08:00
FileByte []byte
2020-11-21 21:51:07 +08:00
FileOldName string
FileNewName string
2023-02-27 15:25:33 +08:00
FileType string
File interface{}
2020-11-21 21:51:07 +08:00
}
type OssFileInterface interface {
2023-02-27 15:25:33 +08:00
FileTypeTransForm() (*OssFile, error)
2020-11-21 21:51:07 +08:00
GetFileType() *OssFile
}
// FileTypeTransForm file type transform
2023-02-27 15:25:33 +08:00
// @title 文件类型转换
func (ossFile *OssFile) FileTypeTransForm() (*OssFile, error) {
2020-11-21 21:51:07 +08:00
var err error
switch ossFile.File.(type) {
case *os.File:
2021-03-16 11:17:11 +08:00
2023-02-27 15:25:33 +08:00
ossFile.FileByte, err = ioutil.ReadAll(ossFile.File.(*os.File))
2020-11-21 21:51:07 +08:00
if err != nil {
2023-02-27 15:25:33 +08:00
return nil, errors.New("read os type file failed:" + err.Error())
2020-11-21 21:51:07 +08:00
}
2023-02-27 15:25:33 +08:00
_, ossFile.FileOldName = filepath.Split(ossFile.File.(*os.File).Name())
2020-11-21 21:51:07 +08:00
2021-03-16 10:30:34 +08:00
break
2020-11-21 21:51:07 +08:00
case *multipart.FileHeader:
2023-02-27 15:25:33 +08:00
fileResources, err := ossFile.File.(*multipart.FileHeader).Open()
2020-11-21 21:51:07 +08:00
if err != nil {
panic("open multipart file failed:" + err.Error())
}
defer fileResources.Close()
2023-02-27 15:25:33 +08:00
ossFile.FileByte, err = ioutil.ReadAll(fileResources)
2020-11-21 21:51:07 +08:00
if err != nil {
2023-02-27 15:25:33 +08:00
return nil, errors.New("read multipart file failed:" + err.Error())
2020-11-21 21:51:07 +08:00
}
ossFile.FileOldName = ossFile.File.(*multipart.FileHeader).Filename
2021-03-16 10:30:34 +08:00
break
2020-11-21 21:51:07 +08:00
case string:
2023-02-27 15:25:33 +08:00
newFile, err := os.Open(ossFile.File.(string))
2020-11-21 21:51:07 +08:00
if err != nil {
2023-02-27 15:25:33 +08:00
return nil, errors.New("open file path failed:" + err.Error())
2020-11-21 21:51:07 +08:00
}
defer newFile.Close()
2023-02-27 15:25:33 +08:00
ossFile.FileByte, err = ioutil.ReadAll(newFile)
2020-11-21 21:51:07 +08:00
2023-02-27 15:25:33 +08:00
_, ossFile.FileOldName = filepath.Split(newFile.Name())
2020-11-21 21:51:07 +08:00
2021-03-16 10:30:34 +08:00
break
2021-03-16 11:17:11 +08:00
// 支持[]byte数组传递 因为无法解析文件类型 默认直接给出文件类型为.png
2021-03-16 10:30:34 +08:00
case []byte:
ossFile.FileByte = ossFile.File.([]byte)
2021-03-16 11:17:11 +08:00
//判断是否指定了文件的类型 如果没有指定默认为png格式
if ossFile.FileType == "" || len(ossFile.FileType) <= 0 {
ossFile.FileOldName = uuid.NewV4().String() + ".png"
} else {
ossFile.FileOldName = uuid.NewV4().String() + ossFile.FileType
}
2021-03-16 10:30:34 +08:00
break
2020-11-21 21:51:07 +08:00
default:
fmt.Println(reflect.TypeOf(ossFile.File))
2023-02-27 15:25:33 +08:00
return nil, errors.New("file type is not support")
2020-11-21 21:51:07 +08:00
}
ossFile.GetFileType()
2023-02-27 15:25:33 +08:00
return ossFile, nil
2020-11-21 21:51:07 +08:00
}
// GetFileType split file type and generate file name
2023-02-27 15:25:33 +08:00
// 截取文件类型
2020-11-21 21:51:07 +08:00
func (ossFile *OssFile) GetFileType() *OssFile {
2021-03-16 11:17:11 +08:00
// 当没有传递文件类型时去文件名中截取出文件类型
if ossFile.FileType == "" || len(ossFile.FileType) <= 0 {
//from oldFileName split file type
2023-02-27 15:25:33 +08:00
fileTypeSufIndex := strings.Index(ossFile.FileOldName, ".")
2020-11-21 21:51:07 +08:00
2021-03-16 11:17:11 +08:00
fileType := ossFile.FileOldName[fileTypeSufIndex:]
ossFile.FileType = fileType
}
2020-11-21 21:51:07 +08:00
//generate only file name
2023-02-27 15:25:33 +08:00
ossFile.FileNewName = uuid.NewV5(uuid.NewV4(), ossFile.FileOldName).String() + ossFile.FileType
2020-11-21 21:51:07 +08:00
return ossFile
2023-02-27 15:25:33 +08:00
}