67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package upload
|
|
|
|
import (
|
|
"io"
|
|
"mime/multipart"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
// Local 本地存储
|
|
type Local struct {
|
|
StorePath string
|
|
BasePath string
|
|
}
|
|
|
|
// NewLocal 创建本地存储
|
|
func NewLocal(storePath, basePath string) *Local {
|
|
return &Local{
|
|
StorePath: storePath,
|
|
BasePath: basePath,
|
|
}
|
|
}
|
|
|
|
// UploadFile 上传文件
|
|
func (l *Local) UploadFile(file *multipart.FileHeader) (string, string, error) {
|
|
// 生成文件名和路径
|
|
fileName := GenerateFileName(file.Filename)
|
|
filePath := GeneratePath(l.BasePath)
|
|
fullPath := path.Join(l.StorePath, filePath)
|
|
|
|
// 创建目录
|
|
if err := os.MkdirAll(fullPath, os.ModePerm); err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
// 打开源文件
|
|
src, err := file.Open()
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
defer src.Close()
|
|
|
|
// 创建目标文件
|
|
dstPath := path.Join(fullPath, fileName)
|
|
dst, err := os.Create(dstPath)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
defer dst.Close()
|
|
|
|
// 复制文件
|
|
if _, err = io.Copy(dst, src); err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
// 返回访问路径和存储key
|
|
accessPath := path.Join("/", filePath, fileName)
|
|
key := path.Join(filePath, fileName)
|
|
return accessPath, key, nil
|
|
}
|
|
|
|
// DeleteFile 删除文件
|
|
func (l *Local) DeleteFile(key string) error {
|
|
fullPath := path.Join(l.StorePath, key)
|
|
return os.Remove(fullPath)
|
|
}
|