11 changed files with 339 additions and 46 deletions
@ -0,0 +1,53 @@ |
|||
package core |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fss/db" |
|||
"fss/util" |
|||
"net/http" |
|||
"strings" |
|||
) |
|||
|
|||
type Brespone struct { |
|||
Status string `json:"status"` |
|||
Data []db.StFileInfo `json:"data"` //目录下的文件
|
|||
} |
|||
|
|||
// 输出数据库中的基础文件的结构和hash
|
|||
func BfsInfo(w http.ResponseWriter, r *http.Request) { |
|||
// 监听的目录通过?p=的方式传入
|
|||
urlpath := r.URL.Query().Get("p") |
|||
// 防止逃逸,造成漏洞
|
|||
if strings.Contains(urlpath, "../") { |
|||
// urlpath = "Lg=="
|
|||
urlpath = "." |
|||
} |
|||
|
|||
// 如果根目录
|
|||
if urlpath == "" || urlpath == "." { |
|||
urlpath = util.Bas64end(".") |
|||
} |
|||
|
|||
// 链接数据库
|
|||
db.Init() |
|||
// 获取请求的信息
|
|||
flists := db.Fquery(urlpath) |
|||
// fmt.Printf("stfile :%v\n", flist)
|
|||
|
|||
//
|
|||
bfslist := make([]db.StFileInfo, 0) |
|||
//
|
|||
for _, v := range flists { |
|||
bfslist = append(bfslist, v) |
|||
} |
|||
|
|||
// fmt.Fprintf(w, "%s:sqlite query ...", r.Host)
|
|||
response := Brespone{ |
|||
Status: "success", |
|||
Data: bfslist, |
|||
} |
|||
|
|||
// 开启跨域
|
|||
uCorsHadler(w, r) |
|||
json.NewEncoder(w).Encode(response) |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
package db |
|||
|
|||
// 定义数据库中用的模型
|
|||
type StFileInfo struct { |
|||
Id string `json:"id"` |
|||
Fpath string `json:"fpath"` |
|||
Fhash string `json:"fhash"` |
|||
Fname string `json:"fname"` |
|||
} |
|||
@ -0,0 +1,100 @@ |
|||
package db |
|||
|
|||
import ( |
|||
"fmt" |
|||
|
|||
// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
|
|||
"github.com/jmoiron/sqlx" |
|||
_ "github.com/logoove/sqlite" |
|||
) |
|||
|
|||
var db *sqlx.DB |
|||
var err error |
|||
|
|||
func Init() { |
|||
fmt.Printf("hey,I am initilize function in SqliteDb\n") |
|||
//
|
|||
// Open() 函数指定驱动名称和数据源名称
|
|||
db, err = sqlx.Open("sqlite", "ups.db") |
|||
if err != nil { |
|||
fmt.Printf("Database creation failed: %v\n", err) |
|||
return |
|||
} |
|||
// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
|
|||
// defer db.Close()
|
|||
//
|
|||
connectDB() |
|||
} |
|||
|
|||
// 连接数据库
|
|||
func connectDB() { |
|||
var version string |
|||
// QueryRow() 执行查询,返回版本号
|
|||
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version) |
|||
if err != nil { |
|||
fmt.Printf("Database creation failed: %v\n", err) |
|||
return |
|||
} |
|||
// 连接成功,打印出"database connected:版本号"
|
|||
fmt.Printf("Database creation successful: %v\n", version) |
|||
} |
|||
|
|||
// 创建数据库表
|
|||
func CreateTable() { |
|||
// 建表语句
|
|||
sts := ` |
|||
CREATE TABLE f_info ( |
|||
id INTEGER PRIMARY KEY NOT NULL, |
|||
fname TEXT NOT NULL, |
|||
fpath TEXT NOT NULL, |
|||
fhash TEXT NOT NULL |
|||
);` |
|||
|
|||
// 使用db.Exec() 函数来执行 SQL 语句
|
|||
_, err = db.Exec(sts) |
|||
if err != nil { |
|||
fmt.Printf("Failed to create database table: %v\n", err) |
|||
return |
|||
} |
|||
fmt.Printf("Successfully created database table! \n") |
|||
} |
|||
|
|||
// 插入数据
|
|||
func InsertStf(sf StFileInfo) { |
|||
// 插入语句
|
|||
res, err := db.Exec("INSERT INTO f_info(fname, fpath,fhash) VALUES(?,?,?)", sf.Fname, sf.Fpath, sf.Fhash) |
|||
if err != nil { |
|||
fmt.Printf("Insert data failed: %v\n", err) |
|||
return |
|||
} |
|||
|
|||
// 获取自增ID
|
|||
lastInsertId, _ := res.LastInsertId() |
|||
fmt.Printf("Successfully inserted data, lastInsertId = %v\n", lastInsertId) |
|||
} |
|||
|
|||
// 查询数据
|
|||
func Fquery(fpbs string) (stlist []StFileInfo) { |
|||
// 结果重量集合
|
|||
stlist = make([]StFileInfo, 0) |
|||
|
|||
// 查询语句
|
|||
rows, err := db.Query("SELECT fname,fpath,fhash FROM f_info WHERE fpbs = ?", fpbs) |
|||
//
|
|||
if err != nil { |
|||
fmt.Printf("Failed to query data: %v\n", err) |
|||
return |
|||
} |
|||
// FOR loop
|
|||
for rows.Next() { |
|||
// var weight float64
|
|||
var st StFileInfo |
|||
err = rows.Scan(&st.Fname, &st.Fpath, &st.Fhash) |
|||
if err != nil { |
|||
fmt.Printf("Failed to read data: %v\n", err) |
|||
continue |
|||
} |
|||
stlist = append(stlist, st) |
|||
} |
|||
return stlist |
|||
} |
|||
@ -1,3 +1,30 @@ |
|||
module fss |
|||
|
|||
go 1.22.1 |
|||
|
|||
require ( |
|||
github.com/jmoiron/sqlx v1.4.0 |
|||
github.com/logoove/sqlite v1.16.1 |
|||
) |
|||
|
|||
require ( |
|||
github.com/dustin/go-humanize v1.0.1 // indirect |
|||
github.com/google/uuid v1.6.0 // indirect |
|||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect |
|||
github.com/mattn/go-isatty v0.0.20 // indirect |
|||
github.com/ncruces/go-strftime v0.1.9 // indirect |
|||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect |
|||
golang.org/x/mod v0.16.0 // indirect |
|||
golang.org/x/sys v0.22.0 // indirect |
|||
golang.org/x/tools v0.19.0 // indirect |
|||
lukechampine.com/uint128 v1.2.0 // indirect |
|||
modernc.org/cc/v3 v3.41.0 // indirect |
|||
modernc.org/ccgo/v3 v3.17.0 // indirect |
|||
modernc.org/libc v1.54.4 // indirect |
|||
modernc.org/mathutil v1.6.0 // indirect |
|||
modernc.org/memory v1.8.0 // indirect |
|||
modernc.org/opt v0.1.3 // indirect |
|||
modernc.org/sqlite v1.30.1 // indirect |
|||
modernc.org/strutil v1.2.0 // indirect |
|||
modernc.org/token v1.1.0 // indirect |
|||
) |
|||
|
|||
@ -0,0 +1,71 @@ |
|||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= |
|||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= |
|||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= |
|||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= |
|||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= |
|||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= |
|||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= |
|||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= |
|||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= |
|||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
|||
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= |
|||
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= |
|||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= |
|||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= |
|||
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= |
|||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= |
|||
github.com/logoove/sqlite v1.16.1 h1:O67OSZ6Fnn1cfW8MT36G58RTAIqMGSDlvXEOirDnYqE= |
|||
github.com/logoove/sqlite v1.16.1/go.mod h1:mMaqL4e4znHBmvlMeJzwpVzEVsJ0oD6DAjjblkfdRpw= |
|||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= |
|||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= |
|||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= |
|||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= |
|||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= |
|||
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= |
|||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
|||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
|||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= |
|||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= |
|||
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= |
|||
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= |
|||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= |
|||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= |
|||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |
|||
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= |
|||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= |
|||
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= |
|||
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= |
|||
lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= |
|||
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= |
|||
modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= |
|||
modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= |
|||
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= |
|||
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= |
|||
modernc.org/ccgo/v3 v3.17.0 h1:o3OmOqx4/OFnl4Vm3G8Bgmqxnvxnh0nbxeT5p/dWChA= |
|||
modernc.org/ccgo/v3 v3.17.0/go.mod h1:Sg3fwVpmLvCUTaqEUjiBDAvshIaKDB0RXaf+zgqFu8I= |
|||
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= |
|||
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= |
|||
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= |
|||
modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= |
|||
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= |
|||
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= |
|||
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= |
|||
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= |
|||
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= |
|||
modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= |
|||
modernc.org/libc v1.54.4 h1:eDr4WnANZv+aRBKNCDo4khJbaHpxoTNOxeXqpznSZyY= |
|||
modernc.org/libc v1.54.4/go.mod h1:CH8KSvv67UxcGCOLizggw3Zi3yT+sUjLWysK/YeUnqk= |
|||
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= |
|||
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= |
|||
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= |
|||
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= |
|||
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= |
|||
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= |
|||
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= |
|||
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= |
|||
modernc.org/sqlite v1.30.1 h1:YFhPVfu2iIgUf9kuA1CR7iiHdcEEsI2i+yjRYHscyxk= |
|||
modernc.org/sqlite v1.30.1/go.mod h1:DUmsiWQDaAvU4abhc/N+djlom/L2o8f7gZ95RCvyoLU= |
|||
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= |
|||
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= |
|||
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= |
|||
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= |
|||
Binary file not shown.
@ -0,0 +1,72 @@ |
|||
package util |
|||
|
|||
import ( |
|||
"crypto/sha256" |
|||
"encoding/base64" |
|||
"fmt" |
|||
"io" |
|||
"os" |
|||
"path/filepath" |
|||
) |
|||
|
|||
// 遍历目录下的文件
|
|||
// 是否只扫相对路径下
|
|||
func GetDirFilePaths(dirPath string, relativeOnly bool) ([]string, error) { |
|||
var filePaths []string |
|||
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { |
|||
if err != nil { |
|||
return err |
|||
} |
|||
if !info.IsDir() { |
|||
if relativeOnly { |
|||
fileName := filepath.Base(path) |
|||
relativePath := filepath.ToSlash(filepath.Join(filepath.Base(dirPath), fileName)) |
|||
filePaths = append(filePaths, relativePath) |
|||
} else { |
|||
filePaths = append(filePaths, filepath.ToSlash(path)) |
|||
} |
|||
} |
|||
return nil |
|||
}) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
return filePaths, nil |
|||
} |
|||
|
|||
// base64 encode
|
|||
// url safe
|
|||
func Bas64end(str string) string { |
|||
// bdata:=
|
|||
return base64.URLEncoding.EncodeToString([]byte(str)) |
|||
} |
|||
|
|||
// base64 url safe uneconde
|
|||
func Base64dec(bsstr string) string { |
|||
dedc, _ := base64.URLEncoding.DecodeString(bsstr) |
|||
return string(dedc) |
|||
} |
|||
|
|||
// 计算文件的hash
|
|||
func CalacHash(rfile string) string { |
|||
// 获取到真实地址
|
|||
//
|
|||
file, err := os.Open(rfile) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
defer file.Close() |
|||
|
|||
// initlize hash object
|
|||
hash := sha256.New() |
|||
|
|||
// write file into hash object
|
|||
if _, err := io.Copy(hash, file); err != nil { |
|||
panic(err) |
|||
} |
|||
// get hash value
|
|||
hashBytes := hash.Sum(nil) |
|||
//converto to hash string
|
|||
hastString := fmt.Sprintf("%x", hashBytes) |
|||
return hastString |
|||
} |
|||
Binary file not shown.
Loading…
Reference in new issue