完成数据库初始化创建文件功能

This commit is contained in:
Kakune55 2023-12-18 22:46:59 +08:00
parent 379822dca4
commit 42c764f825
2 changed files with 188 additions and 25 deletions

84
database/db.go Normal file
View File

@ -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
}

129
main.go
View File

@ -1,18 +1,60 @@
package main package main
import ( import (
"Pixel/database"
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"html/template" "html/template"
"io" "io"
"log" "log"
"math/rand"
"net/http" "net/http"
"os" "os"
"path"
"strconv" "strconv"
"time" "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() { func main() {
http.HandleFunc("/upload", upload) //设置访问的路由 http.HandleFunc("/upload", upload) //设置访问的路由
@ -25,30 +67,67 @@ func main() {
// 处理/upload 逻辑 // 处理/upload 逻辑
func upload(w http.ResponseWriter, r *http.Request) { func upload(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //获取请求的方法 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))
t, _ := template.ParseFiles("Web/upload.html") if r.Method == "GET" { // 前端页面渲染
t.Execute(w, token) crutime := time.Now().Unix()
} else { //后端POST接收逻辑 h := md5.New()
r.ParseMultipartForm(32 << 20) io.WriteString(h, strconv.FormatInt(crutime, 10))
file, handler, err := r.FormFile("file") token := fmt.Sprintf("%x", h.Sum(nil))
if err != nil {
fmt.Println(err) t, _ := template.ParseFiles("Web/upload.html")
return t.Execute(w, token)
} } else { // 后端POST接收逻辑
defer file.Close() r.ParseMultipartForm(32 << 20)
fmt.Fprintf(w, "%v", handler.Header) file, handler, err := r.FormFile("file")
f, err := os.OpenFile("./test/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666) // 此处假设当前目录下已存在test目录 if err != nil {
if err != nil { fmt.Println(err)
fmt.Println(err) return
return }
} defer file.Close()
defer f.Close()
io.Copy(f, file) // 生成文件的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))]
}
return string(bytes)
} }