Upload files to "/"
This commit is contained in:
@@ -0,0 +1,91 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
_ "modernc.org/sqlite"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
db, err := sql.Open("sqlite", "base.db")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
_, err = db.Exec("CREATE TABLE IF NOT EXISTS urls (short TEXT, long TEXT)")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||||
|
c := rng.Int63()
|
||||||
|
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path == "/" && r.Method == "GET" {
|
||||||
|
fmt.Fprintln(w, "<h1>shortener</h1>")
|
||||||
|
fmt.Fprintln(w, "<form method='POST'>")
|
||||||
|
fmt.Fprintln(w, "<input name='url' placeholder='https://example.com'>")
|
||||||
|
fmt.Fprintln(w, "<button>ok</button>")
|
||||||
|
fmt.Fprintln(w, "</form>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.URL.Path == "/" && r.Method == "POST" {
|
||||||
|
a := r.FormValue("url")
|
||||||
|
|
||||||
|
if a == "" {
|
||||||
|
fmt.Fprintln(w, "empty")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
u, err := url.Parse(a)
|
||||||
|
if err != nil || u.Scheme == "" || u.Host == "" {
|
||||||
|
fmt.Fprintln(w, "bad url")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
b := ""
|
||||||
|
t := c
|
||||||
|
c = c + 1
|
||||||
|
for t > 0 {
|
||||||
|
b = string(s[t%62]) + b
|
||||||
|
t = t / 62
|
||||||
|
}
|
||||||
|
for len(b) < 6 {
|
||||||
|
b = string(s[0]) + b
|
||||||
|
}
|
||||||
|
|
||||||
|
// сохранение в базу
|
||||||
|
_, err = db.Exec("INSERT INTO urls (short, long) VALUES (?, ?)", b, a)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(w, "db error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintln(w, "short url: http://localhost:8080/"+b)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
x := r.URL.Path[1:]
|
||||||
|
y := ""
|
||||||
|
|
||||||
|
err = db.QueryRow("SELECT long FROM urls WHERE short = ?", x).Scan(&y)
|
||||||
|
|
||||||
|
if err != nil || y == "" {
|
||||||
|
fmt.Fprintln(w, "not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
http.Redirect(w, r, y, 302)
|
||||||
|
})
|
||||||
|
|
||||||
|
fmt.Println("start http://localhost:8080")
|
||||||
|
http.ListenAndServe(":8080", nil)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user