154 lines
3.2 KiB
Go
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
|
|
}
|