درود دوستان امروز میخوام در مورد بخش سوم از سری مقالات فرم ورک Gin صحبت کنیم
فهرست بخش سوم از این مقاله
میریم واسه توضیح هر بخش
router.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "anonymous") })
فرض کنید یه فرم دارید به اسم مثلن form.html و یه تکست باکس به اسم message دارید و میخواید اطلاعات رو از این فرم بفرستید سمت سرور. خوب کافی هست از c.postform استفاده کنید که در خط شماره دو می باشد. اما واسه اختیاری کردن فیلد یعنی زمانی که فیلدی خالی بود یه متن یا چیزی توی فرم برای ما بفرست از دستور ی که در خط چهار هست استفاده می کنیم.
این شمای رو در نظر بگیرید
POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1
Content-Type: application/x-www-form-urlencoded
names[first]=thinkerou&names[second]=tianou
کد زیر:
router.POST("/post", func(c *gin.Context) { ids := c.QueryMap("ids") names := c.PostFormMap("names") fmt.Printf("ids: %v; names: %v", ids, names) })
خروجی مربوط به QueryMap در خط دوم
ids: map[b:hello a:1234]
خروجی مربوط به PostFormMap در خط سوم
names: map[second:tianou first:thinkerou]
خوب الان میخوام توضیح بدم در مورد کدها فوق
توی این روش تمام داده های که قرار ارسال بشه به صورت یک مپ درآمده و ارسال میشه که در خروجی های بالا مثلن names ما یک key داریم و یک value که در اینجا value های ما دادهای ارسالی ما هستن و داخل آکولاد اگر مشاهده کنبد کلید های ما هستن(شمای کلی رو نگاه کنید)
آپلود فایل به صورت تکی
نمونه کد:
router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") log.Println(file.Filename) var dst string = "dir/file/upload/ c.SaveUploadedFile(file, dst) })
برای آپلود فایل به صورت تکی از متدی که در خط سوم می باشد استفاده می کنیم. پارامتری که میگیره نام اون فرم آپلود می باشد. خوب توی خط اول ما سایز فایل رو مشخص کردیم و توی خط پنج آپلود عکس توی یه فلود ر خاص رو مشخص کردیم
تست با curl:
curl -X POST http://localhost:8080/upload \
-F "file=@/Users/appleboy/test.zip" \
-H "Content-Type: multipart/form-data"
آپلود فایل به صورت چندتایی
نمونه کد:
router.POST("/upload", func(c *gin.Context) { form, _ := c.MultipartForm() files := form.File["upload[]"] for _, file := range files { c.SaveUploadedFile(file, dst) } })
برای آپلود فایل به صورت چندتایی از متدی که در خط دوم (MultipartForm) می باشد استفاده می کنیم. توی خط سوم پارامتری که میگیره نام اون فرم آپلود می باشد. که قرار چندتایی فایل آپلود بشه بخاطر همین توی آرایه هست و بعدش توی یه حلقه for اون فایل های دریافتی رو توی یه مسیر خاص با استفاده از متدی که توی خط پنج هست (aveuploadfile) انجام میشه.
تست با curl:
curl -X POST http://localhost:8080/upload \
-F "upload[]=@/Users/appleboy/test1.zip" \
-F "upload[]=@/Users/appleboy/test2.zip" \
-H "Content-Type: multipart/form-data"