From 42c764f825339e8d1d3d0b24db87057c8c6fdff0 Mon Sep 17 00:00:00 2001 From: Kakune55 Date: Mon, 18 Dec 2023 22:46:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=88=9B=E5=BB=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/db.go | 84 ++++++++++++++++++++++++++++++++ main.go | 129 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 188 insertions(+), 25 deletions(-) create mode 100644 database/db.go diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..2f35c9a --- /dev/null +++ b/database/db.go @@ -0,0 +1,84 @@ +package database + +import ( + "database/sql" + "log" + + _ "github.com/mattn/go-sqlite3" +) + +func Initdb() { + db, err := sql.Open("sqlite3", "./data/database.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + // 创建表的SQL语句 + createTableSQL := ` + CREATE TABLE IF NOT EXISTS mytable ( + link TEXT PRIMARY KEY, + md5 TEXT NOT NULL + ); + ` + + _, err = db.Exec(createTableSQL) + if err != nil { + log.Fatal(err) + } +} + +func NewFile(linkID string, md5 string) { + db, err := sql.Open("sqlite3", "./data/database.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + // SQL语句 + SQL := ` + INSERT INTO "main"."mytable" ("link", "md5") VALUES (?, ?) + ` + + stmt, err := db.Prepare(SQL) + if err != nil { + log.Fatal(err) + } + + _, err = stmt.Exec(linkID,md5) //插入记录 + if err != nil { + log.Fatal(err) + } +} + +func GetFileInfo(linkID string) string { + db, err := sql.Open("sqlite3", "./data/database.db") + if err != nil { + log.Fatal(err) + } + defer db.Close() + + // SQL语句 + SQL := ` + SELECT * FROM "mytable" WHERE link = ? + ` + + row := db.QueryRow(SQL,linkID) + if err != nil { + log.Fatal(err) + } + + // 扫描查询结果 + var md5 string + var linkIDx string + err = row.Scan(&linkIDx,&md5) + if err != nil { + if err == sql.ErrNoRows { + return "" + } else { + log.Fatal(err) + } + return "" + } + return md5 +} \ No newline at end of file diff --git a/main.go b/main.go index 1ff34dd..64146f0 100644 --- a/main.go +++ b/main.go @@ -1,18 +1,60 @@ package main import ( + "Pixel/database" "crypto/md5" "fmt" "html/template" "io" "log" + "math/rand" "net/http" "os" + "path" "strconv" "time" ) +func init() { + const appinfo string = ` + + ______ ________ ______ __ __ __ + /_____/\ /_______/\ /_____/\ /__/\ /__/\ /_/\ + \:::_ \ \ \__.::._\/ \::::_\/_ \ \::\\:.\ \ \:\ \ + \:(_) \ \ \::\ \ \:\/___/\ \_\::_\:_\/ \:\ \ + \: ___\/ _\::\ \__ \::___\/_ _\/__\_\_/\ \:\ \____ + \ \ \ /__\::\__/\ \:\____/\ \ \ \ \::\ \ \:\/___/\ + \_\/ \________\/ \_____\/ \_\/ \__\/ \_____\/ + + + ` + fmt.Println(appinfo) + + database.Initdb() //初始化数据库 + dirPath := "./data/img" + + // 使用 os.Stat 检查目录是否存在 + _, err := os.Stat(dirPath) + + if os.IsNotExist(err) { + // 目录不存在,可以调用 os.Mkdir 创建 + err := os.Mkdir(dirPath, 0755) + if err != nil { + fmt.Println("无法创建目录:", err) + return + } + fmt.Println("目录创建成功:", dirPath) + } else if err == nil { + // 目录已存在 + fmt.Println("目录已存在:", dirPath) + } else { + // 发生其他错误 + fmt.Println("发生错误:", err) + } +} + + func main() { http.HandleFunc("/upload", upload) //设置访问的路由 @@ -25,30 +67,67 @@ func main() { // 处理/upload 逻辑 func upload(w http.ResponseWriter, r *http.Request) { - fmt.Println("method:", r.Method) //获取请求的方法 - if r.Method == "GET" { //前端页面渲染 - crutime := time.Now().Unix() - h := md5.New() - io.WriteString(h, strconv.FormatInt(crutime, 10)) - token := fmt.Sprintf("%x", h.Sum(nil)) + fmt.Println("method:", r.Method) // 获取请求的方法 - t, _ := template.ParseFiles("Web/upload.html") - t.Execute(w, token) - } else { //后端POST接收逻辑 - r.ParseMultipartForm(32 << 20) - file, handler, err := r.FormFile("file") - if err != nil { - fmt.Println(err) - return - } - defer file.Close() - fmt.Fprintf(w, "%v", handler.Header) - f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) // 此处假设当前目录下已存在test目录 - if err != nil { - fmt.Println(err) - return - } - defer f.Close() - io.Copy(f, file) + if r.Method == "GET" { // 前端页面渲染 + crutime := time.Now().Unix() + h := md5.New() + io.WriteString(h, strconv.FormatInt(crutime, 10)) + token := fmt.Sprintf("%x", h.Sum(nil)) + + t, _ := template.ParseFiles("Web/upload.html") + t.Execute(w, token) + } else { // 后端POST接收逻辑 + r.ParseMultipartForm(32 << 20) + file, handler, err := r.FormFile("file") + if err != nil { + fmt.Println(err) + return + } + defer file.Close() + + // 生成文件的MD5哈希 + h := md5.New() + if _, err := io.Copy(h, file); err != nil { + fmt.Println(err) + return + } + md5sum := fmt.Sprintf("%x", h.Sum(nil)) + + // 获取文件扩展名 + fname := handler.Filename + ext := path.Ext(fname) + + // 创建新文件,使用MD5哈希和原始扩展名 + newFilename := md5sum + ext + f, err := os.OpenFile("./data/img/"+newFilename, os.O_WRONLY|os.O_CREATE, 0666) + if err != nil { + fmt.Println(err) + return + } + defer f.Close() + + // 将文件内容拷贝到新文件 + _, err = file.Seek(0, 0) + if err != nil { + fmt.Println(err) + return + } + io.Copy(f, file) + + // 存入数据库 + database.NewFile(RandomString(10),md5sum) + + } +} + + +func RandomString(n int) string { + const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + bytes := make([]byte, n) + rand.Seed(time.Now().UnixNano()) + for i := 0; i < n; i++ { + bytes[i] = letters[rand.Intn(len(letters))] } -} \ No newline at end of file + return string(bytes) +}