Files
go-site-clone/utils/file.go
2025-10-25 18:10:58 +08:00

154 lines
3.2 KiB
Go

package utils
import (
"fmt"
"go-site-clone/config"
"io"
"log"
"net/http"
"net/url"
"os"
"path"
"path/filepath"
"time"
)
type File struct{}
type FileDir struct {
Name string `json:"name"`
Size int64 `json:"size"`
Mode string `json:"mode"`
ModTime time.Time `json:"modTime"`
}
// 下载文件到本地
func (*File) Download(uri string) string {
// 解析文件链接及 路径
u, err := url.Parse(uri)
if err != nil {
return ""
}
host := u.Hostname()
if u.Port() != "" {
host += u.Port()
}
// 获取路径部分
filePath := u.Path
appConfig, _ := config.LoadConfig()
fp := filepath.Join(appConfig.SiteFileDir, host, filePath)
// 获取文件名
// fileName := path.Base(filePath)
log.Println("开始下载:", uri)
resp, err := http.Get(uri)
if err != nil {
fmt.Println("下载失败:", err)
return ""
}
defer resp.Body.Close()
// 创建本地文件
outFile, err := CreateFileWithDirs(fp)
if err != nil {
fmt.Println("文件创建失败:", err)
return ""
}
defer outFile.Close()
// 将响应内容写入文件
_, err = io.Copy(outFile, resp.Body)
if err != nil {
fmt.Println("写入失败:", err)
return ""
}
fmt.Println("下载完成:", fp)
return fp
}
// 创建目录
func CreateFileWithDirs(filePath string) (*os.File, error) {
// 取出目录部分
dir := filepath.Dir(filePath)
// 确保目录存在(递归创建)
if err := os.MkdirAll(dir, os.ModePerm); err != nil {
return nil, fmt.Errorf("创建目录失败: %w", err)
}
// 创建文件(如果已存在会清空)
f, err := os.Create(filePath)
if err != nil {
return nil, fmt.Errorf("创建文件失败: %w", err)
}
return f, nil
}
// 下载html文件到本地
func (*File) HTMLDownload(uri string) string {
// 解析文件链接及 路径
u, err := url.Parse(uri)
if err != nil {
return ""
}
host := u.Hostname()
if u.Port() != "" {
host += u.Port()
}
// 获取路径部分
filePath := u.Path
appConfig, _ := config.LoadConfig()
// 获取文件名
fileName := path.Base(filePath)
if fileName == "/" || filePath == "" {
filePath = filePath + "/index.html"
}
fp := filepath.Join(appConfig.SiteFileDir, host, filePath)
log.Println("开始下载:", uri)
resp, err := http.Get(uri)
if err != nil {
fmt.Println("下载失败:", err)
return ""
}
defer resp.Body.Close()
// 创建本地文件
outFile, err := CreateFileWithDirs(fp)
if err != nil {
fmt.Println("文件创建失败:", err)
return ""
}
defer outFile.Close()
// 将响应内容写入文件
_, err = io.Copy(outFile, resp.Body)
if err != nil {
fmt.Println("写入失败:", err)
return ""
}
fmt.Println("下载完成:", fp)
return fp
}
// 获取文件夹列表
func (*File) GetFileDirList(filePath string) []FileDir {
var fileList []FileDir
entries, err := os.ReadDir(filePath)
if err != nil {
return nil
}
for _, entry := range entries {
if entry.IsDir() {
info, err := entry.Info()
if err != nil {
fmt.Println("无法获取属性:", err)
continue
}
fileList = append(fileList, FileDir{
Name: entry.Name(),
Size: info.Size(),
Mode: info.Mode().String(),
ModTime: info.ModTime(),
})
}
}
return fileList
}