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(刷新)。
仍然困惑着真正发生的事情?让我解释一下!
首先,使用“ listenandserve”命令播放运行服务器的功能。 'http.handlefunc(“/new”,new)'将通过调用'new'函数访问'http://localhost:9999/new'。随之而来的链反应:
因此,我们设法制作的“创建”函数!
最后,为了促进知识和回滚的转移,然后我玩。因此,如果您只是研究这个阶段,当您检查完整的存储库之前,您不会感到困惑。只需检查V2文件即可。回滚过程也将更容易