Golang Postgres中的“创建”和“上传”:后端
#postgres #go #backend #indonesia

CEK文件文件V2

存储库/源代码:https://github.com/JaisySymuri/postgre

创建一个新的“文件”文件夹,以适应我们将要上传的文件。然后在main.go中,在DBCONN函数之前,创建一个员工的结构

main.go

type Employee struct {
    ID_Pegawai    int
    NIK           string
    Nama          string
    Username      string
    Password      string
    Alamat        string
    Tempat_Lahir  string
    Tanggal_Lahir string
    No_HP         string
    Pekerjaan     string
    Gender        string
    Email         string
    Nama_Ibu      string
    File          string
    SearchType    string
}

在Golang上,可变位置,常数,结构和功能不是问题。只是要在记住时很容易,将功能放置在最底部。

然后,在Func dbConn之后,发出一个函数来处理插入查询。填写创建DB变量以打开与数据库的连接并检查Post方法

main.go:插入

func Insert(w http.ResponseWriter, r *http.Request) {

    db := dbConn()
    if r.Method == "POST" {

...

然后,将发送到我们之前制作的“文件”文件夹的文件存储。

main.go:插入

...
alias := r.FormValue("alias")
        uploadedFile, handler, err := r.FormFile("file")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer uploadedFile.Close()

        dir, err := os.Getwd()
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        filename := handler.Filename
        if alias != "" {
            filename = fmt.Sprintf("%s%s", alias, filepath.Ext(handler.Filename))
        }

        fileLocation := filepath.Join(dir, "files", filename)
        targetFile, err := os.OpenFile(fileLocation, os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer targetFile.Close()

        if _, err := io.Copy(targetFile, uploadedFile); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
...

设置代码以接收填写已发送的表格并将其作为查询更改为数据库

main.go:插入

...
NIK := r.FormValue("NIK")
        Nama := r.FormValue("Nama")
        Username := r.FormValue("Username")
        Password := r.FormValue("Password")
        Alamat := r.FormValue("Alamat")
        Tempat_Lahir := r.FormValue("Tempat_Lahir")
        Tanggal_Lahir := r.FormValue("Tanggal_Lahir")
        No_HP := r.FormValue("No_HP")
        Pekerjaan := r.FormValue("Pekerjaan")
        Gender := r.FormValue("Gender")
        Email := r.FormValue("Email")
        Nama_Ibu := r.FormValue("Nama_Ibu")

        insertDynStmt := `insert into "employee"("nik", "nama", "username", "password", "alamat", "tempat_lahir", "tanggal_lahir", "no_hp", "pekerjaan", "gender", "email", "nama_ibu", "file") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`
        _, err = db.Exec(insertDynStmt, NIK, Nama, Username, Password, Alamat, Tempat_Lahir, Tanggal_Lahir, No_HP, Pekerjaan, Gender, Email, Nama_Ibu, filename)

        log.Println("INSERT INTO employee(NIK, Nama, Username, Password, Alamat, Tempat_Lahir, Tanggal_Lahir, No_HP, Pekerjaan, Gender, Email, Nama_Ibu, File) VALUES (" + NIK + ", " + Nama + ", " + Username + ", " + Password + ", " + Alamat + ", " + Tempat_Lahir + ", " + Tanggal_Lahir + ", " + No_HP + ", " + Pekerjaan + ", " + Gender + ", " + Email + ", " + Nama_Ibu + ", " + filename + ")")
...

最后,关闭到数据库的连接并重定向,以便用户在填写表单完成后返回主页。

main.go:插入

...
defer db.Close()
    http.Redirect(w, r, "/", 301)
}

结果是这样的:

main.go

func Insert(w http.ResponseWriter, r *http.Request) {

    db := dbConn()
    if r.Method == "POST" {
        //File Upload
        alias := r.FormValue("alias")
        uploadedFile, handler, err := r.FormFile("file")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer uploadedFile.Close()

        dir, err := os.Getwd()
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        filename := handler.Filename
        if alias != "" {
            filename = fmt.Sprintf("%s%s", alias, filepath.Ext(handler.Filename))
        }

        fileLocation := filepath.Join(dir, "files", filename)
        targetFile, err := os.OpenFile(fileLocation, os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer targetFile.Close()

        if _, err := io.Copy(targetFile, uploadedFile); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        NIK := r.FormValue("NIK")
        Nama := r.FormValue("Nama")
        Username := r.FormValue("Username")
        Password := r.FormValue("Password")
        Alamat := r.FormValue("Alamat")
        Tempat_Lahir := r.FormValue("Tempat_Lahir")
        Tanggal_Lahir := r.FormValue("Tanggal_Lahir")
        No_HP := r.FormValue("No_HP")
        Pekerjaan := r.FormValue("Pekerjaan")
        Gender := r.FormValue("Gender")
        Email := r.FormValue("Email")
        Nama_Ibu := r.FormValue("Nama_Ibu")

        insertDynStmt := `insert into "employee"("nik", "nama", "username", "password", "alamat", "tempat_lahir", "tanggal_lahir", "no_hp", "pekerjaan", "gender", "email", "nama_ibu", "file") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`
        _, err = db.Exec(insertDynStmt, NIK, Nama, Username, Password, Alamat, Tempat_Lahir, Tanggal_Lahir, No_HP, Pekerjaan, Gender, Email, Nama_Ibu, filename)

        log.Println("INSERT INTO employee(NIK, Nama, Username, Password, Alamat, Tempat_Lahir, Tanggal_Lahir, No_HP, Pekerjaan, Gender, Email, Nama_Ibu, File) VALUES (" + NIK + ", " + Nama + ", " + Username + ", " + Password + ", " + Alamat + ", " + Tempat_Lahir + ", " + Tanggal_Lahir + ", " + No_HP + ", " + Pekerjaan + ", " + Gender + ", " + Email + ", " + Nama_Ibu + ", " + filename + ")")
    }
    defer db.Close()
    http.Redirect(w, r, "/", 301)
}

ctrl+s,对于所需的导入软件包。

然后,我们设置了代码,以使模板运行。在Func DBConn之前创建可变TMPL:

main.go

var tmpl = template.Must(template.ParseGlob("form/*"))

创建一个运行“新”模板的函数。

main.go

func New(w http.ResponseWriter, r *http.Request) {

    tmpl.ExecuteTemplate(w, "New", nil)

}

最后,创建设置所有处理程序的主要功能:

main.go

func main() {
    log.Println("Server started on: http://localhost:9999")
    http.HandleFunc("/new", New)
    http.HandleFunc("/insert", Insert)
    http.ListenAndServe(":9999", nil)
}

在这里,我们进行日志,以便在运行应用程序时,终端将告诉我们服务器在所需的端口上工作。通过设置Internet地址和调用功能来调整处理程序。最后,运行服务器的代码。

好吧,通过“ Go Run Main.Go”终端命令运行服务器。如果成功,则终端将使用日志

回复

终端

PS D:\Work\Tutorial\postgre> go run main.go
2023/06/15 15:44:44 Server started on: http://localhost:9999

打开浏览器,然后转到地址http://localhost:9999/new。如果成功,则结果将与我们在前端创建的HTML测试相同。填写表格,然后单击“保存用户”。我们会发现“未找到404”。但这不是问题,因为当我们完成填写表格时,我们尚未设置自动解决的主页。重要的是终端日志,他将成功填写数据库。如果成功,那么他将回答:

终端

2023/06/15 15:36:23 INSERT INTO employee(NIK, Nama, Username, Password, Alamat, Tempat_Lahir, Tanggal_Lahir, No_HP, Pekerjaan, Gender, Email, Nama_Ibu, File) VALUES (33, 333, 333, 352353, 33, 33, 2023-06-11, 33, 33, 33, 33, 33, 33.jpg)

要检查数据库是否完全填充,您可以检查表Plablus(刷新)。

Cek insert

仍然困惑着真正发生的事情?让我解释一下!
首先,使用“ listenandserve”命令播放运行服务器的功能。 'http.handlefunc(“/new”,new)'将通过调用'new'函数访问'http://localhost:9999/new'。随之而来的链反应:

Insert func

因此,我们设法制作的“创建”函数!

最后,为了促进知识和回滚的转移,然后我玩。因此,如果您只是研究这个阶段,当您检查完整的存储库之前,您不会感到困惑。只需检查V2文件即可。回滚过程也将更容易

存储库/源代码:https://github.com/JaisySymuri/postgre